2015-06-29 2 views
0

Я разрабатываю инфраструктуру моделирования с некоторыми случайными событиями (например, источники, которые генерируют результат с определенной вероятностью). До сих пор я делал это, используя функцию random.random(). Пример:Как генерировать независимые одинаково распределенные (iid) случайные величины в python

class source: 
    def output(self, x): 
     if(random.random()<=x): 
      return foo 
a = [] 
for i in xrange(10) 
    a.append(source()) 

for i in xrange(1000): 
    for j in xrange(len(a)): 
     a[j].output() 

Из того, что я понимаю, все источники в моем списке «а» получит случайные числа из одной и той же псевдослучайной источники LFSR, поэтому [0] будет получить образец, а затем [ 1] получит следующий, затем [2] и т. Д. Если random.ramdom() генерирует по-настоящему случайную последовательность, я считаю, что все равно будет генерировать 10 iid-подмножеств значений, так как я предполагаю, что python использует LFSR или аналогичную схему, где каждый последующий образец зависит от предыдущего образца, взятие нескольких подмножеств этих выборок может быть или не быть независимым и идентичным образом распределено.

У меня есть два вопроса:

  1. Каких распределений я на самом деле получить с помощью моего псевдокод или что-то подобное
  2. Как получить несколько одинаково распределенных случайных величин в Python?

Я смотрел на других постах переполнения стека, как этот, например: Generate multiple independent random streams in python , но они не ответили на мой вопрос.

ответ

2

Модуль Python stdlib random реализован с использованием Mersenne Twister. От the docs for random:

Python использует Mersenne Twister в качестве генератора сердечника. Он производит 53-битные прецизионные поплавки и имеет период 2 ** 19937-1.

Я считаю, что это удовлетворяет требованиям независимости. Проверьте the Wikipedia article,, в частности раздел «k -распределение».

+0

Я думаю, что это наводнение на практике (не используя Мерсенну, но скорее отвергая случайность Стандарта), как бы ни была хорошая ссылка на «k-распределение» Мерсенна. –

+0

Я отредактировал свой ответ, надеюсь, будет более ясным, я имел в виду, что ** реализация по умолчанию ** в Python использует Mersenne twister – maxymoo

0

Если вам нужны 10 независимых наборов из 1000 независимых RV каждый, вы можете просто использовать numpy.random.rand.

import numpy as np 

np.random.rand(10, 1000) 

Да, это правда, они только псевдослучайные. Однако они были проверены на случайные свойства. Если вы хотите проверить это, поместите данные любым способом, как вам нравится, и используйте что-то вроде scipy.stats.chi2_contingency для запуска χ ; испытание на независимость.

Смежные вопросы