2016-08-23 7 views
-2

Есть ли способ создать n случайных целых чисел из k цифр.Как сгенерировать n случайных целых чисел из k цифр

Например .. 2000 случайных числа, состоящие из [0, 2, 3]

Моего трика было использовать случайное число генератора, а затем присвоить значения, основанные на диапазонах?

Но было интересно, есть ли лучший способ сделать это в python?

Редактировать: Пример: [0,0,0, 2, 2,3,0,0,2,2, ..... 2000 элементов], содержащих 0,2 и 3 моего подход

def assign(x): 
     if x< 0.3: return 0 
     elif x<0.6: return 2 
     else: return 3 

    x = np.random.rand(num) 

    x = map(lamdba x:assign(x),x) 
+0

Это необходим статистический-модель первого. Или число, состоящее из 10^7 цифр, равновероятно по сравнению с числом 2? – sascha

+4

Пожалуйста, улучшите свой вопрос: 1. Добавьте желаемый результат; 2. Опишите, что вы пробовали до сих пор (в коде).Очень странно видеть такой бедный вопрос от золотого барсука. –

+0

Можете привести пример? Вы хотите генерировать целые числа n, каждый из которых является либо '2',' 3', либо '0' с равным весом? –

ответ

3

Из звуков этого, это выглядит, как вы хотите, чтобы сформировать последовательность длины n, используя только найденные значения в списке k.

Функция Python random.choice в сочетании с пониманием списка идеально подходит для этого.

Следующая функция генерирует список длины n, при этом каждый элемент является случайным элементом, выбранным из k.

from random import choice 

def random_choices(n, k): 
    return [choice(k) for _ in xrange(n)] 

Это то же, что и простое понимание списка.

from random import choice 
foo = [choice(k) for _ in xrange(n)] 

* Благодаря Mr.goosberry за указание на то, что xrange следует заменить range в питона 3.x.x.

+2

Непонятно, что это то, чего хочет OP, и без каких-либо объяснений это не отличный ответ, даже если это так. –

+1

@AdamSmith извините, я был просто взволнован, чтобы найти вопрос, на который я мог ответить, и хотел бы написать свой ответ, прежде чем кто-то еще это сделал; D – Billylegota

+1

Самый быстрый пистолет на западе - это настоящая вещь, но нужно бороться с этим ;-) –

1

Теперь после вашего редактирования ясно, что вы хотите. Вы хотите дискретную выборку некоторых элементов внутри контейнера.

Просто подготовить классы и сделать это:

import numpy as np 
classes = [0, 2, 3] 
samples = np.random.choice(classes, 2000) 

Если вы хотите, чтобы некоторые конкретные вероятности:

import numpy as np 
classes = [0, 2, 3] 
samples = np.random.choice(classes, 2000, p=[0.3, 0.3, 0.4]) 

ВИДЕТЬ docs.

Реализация должна быть намного быстрее, чем ваш подход, который иногда называют дискретизацией рулетки или методом линейного поиска. Существуют некоторые возможные алгоритмы, упомянутые в wiki.

1

Вы можете достичь этого через list comprehension. Чтобы показать результат, я использую 20. Измените его на 2000 согласно вашему требованию.

>>> import random 
>>> x = 20 
>>> [random.choice([0, 2, 3]) for i in range(20)] 
[2, 2, 3, 2, 0, 2, 3, 2, 3, 3, 3, 0, 3, 2, 3, 2, 3, 2, 3, 2] 
+0

Я не совсем уверен, что это то, что хочет OP ... –

+0

@AdamSmith как это сделать? Просто любопытно. –

+1

@ АдамСмит получил тебя. –

1

Вы готовы использовать NumPy, поэтому я рекомендую вам использовать np.random.choice, то есть:

import numpy as np 

N = 2000 
print[np.random.choice([0, 2, 3], p=[1/3.0, 1/3.0, 1/3.0]) for x in range(N)] 
+0

Хорошая избыточность :-) – sascha

+0

@sascha Lol, мы разместили в то же время, не нашли способ дать 1/3 вероятности 3 значениям ... они не будут суммировать 1 – BPL

+0

Что ты делаешь .. Если вам нужна единая выборка, тогда не устанавливайте p (= None)! (И если вы сумасшедшие: используйте '' 'p = [1/3.0, 1/3.0, 1/3.0]' ''). – sascha

0
import numpy as np 
N = 10 
# Generate three vectors of n size 
zeros = np.zeros((N,), dtype = np.int) 
twos = np.zeros((N,), dtype = np.int) + 2 
threes = np.zeros((N,), dtype = np.int) + 3 
# Permutate all together 
df = [] 
df = np.append(df, [zeros, twos, threes]) 
df_shuffled = np.random.shuffle(df) 
print(df) 
Смежные вопросы