2014-09-25 2 views
0
from random import * 
def main(): 
    t = 0 
    for i in range(1000): # thousand 
     t += random() 
    print(t/1000) 
main() 

Я смотрел исходный код образца программы, которую дал мне профессор, и я наткнулся на этот RNG. может ли кто-нибудь объяснить, как работает этот RNG?Генератор случайных чисел Пояснение

+0

Это не глупо, если вы ищете распределение по Гауссу/нормальному. –

+0

@ RussellBorogove На самом деле это невероятно глупо.Это эквивалент вероятности/статистики умножения двух больших чисел A и B, добавляя A к себе B раз. Есть гораздо лучшие способы получить гауссианцев, чем суммировать тысячу униформ. – pjs

+0

Ваш профессор кажется хорошим кандидатом для кого-то, кто мог бы объяснить код (ы), который он написал :) – dimo414

ответ

5

Если вы построили точки, вы увидите, что это фактически дает гауссовское («нормальное») распределение относительно среднего случайной функции.

enter image description here

Generate random numbers following a normal distribution in C/C++ говорит о генерации случайных чисел; это довольно распространенная техника для этого, если все, что у вас есть, - это генератор однородных чисел, как в стандарте C.

То, что я вам предоставил, это гистограмма из 100 000 значений, взятых из вашей функции (конечно, , если вы не знакомы с python). Ось y - это частота появления значения, ось x - это бит значения. Как вы можете видеть, среднее значение равно 1/2, а по трем стандартным отклонениям (99,7 процента от данных) мы почти не имеем значений в диапазоне. Это должно быть интуитивно понятным; мы «обычно» получить 1/2, и очень редко получают .99999

+0

Обратите внимание, что Python имеет гораздо более быстрый способ получить такой вид распространения: random.gauss(). https://docs.python.org/2/library/random.html#random.gauss –

+0

Кроме того, хотя документы не говорят об этом, очевидно, 'random.gauss()' не является потокобезопасным, а 'random .normalvariate() 'is. (Я просто иду [этот ответ StackOverflow] (http://stackoverflow.com/a/8815748/95852).) –

1

Посмотрите документацию. Его очень хорошо написано: https://docs.python.org/2/library/random.html

Идея заключается в том, что эта программа генерирует случайное число в 1000 раз, что является достаточно достаточно, чтобы получить среднее как 0,5

-1

Дело делает это случайным является случайная функция() вызывается. случайным образом() будет генерировать 1 (для большинства практических целей) случайного поплавка между 0 и 1.

>>>random() 
0.1759916412898097 
>>>random() 
0.5489228122596088 

т.д.

В остальном это просто добавляя каждый случайным образом, чтобы в общей сложности с последующим делением на число из рандомов, по существу находив среднее из всех 1000 рандомов, которое, как указывал Кибер, фактически не является случайным числом вообще.

+0

Это случайное, это просто неравномерно случайным. –

0

Программа использует Central Limit Theorem - суммы независимых одинаково распределенных случайных величин X с конечной дисперсией, асимптотически сходятся к нормальному (ака гауссова) распределения, средний представляет собой сумму средств, а дисперсия - это сумма дисперсий. Масштабируя это по N, количество суммируемых X дает среднее значение выборки (среднее значение a.k.a). Если ожидаемое значение X является μ и дисперсия является X σ , ожидаемое значение выборочного среднего также μ и имеет дисперсию σ/Н.

Так как Uniform (0, 1) имеет значение 0,5 и дисперсию 1/12, ваш алгоритм будет генерировать результаты, которые довольно близки к обычно распределенным со средним значением 0,5 и дисперсией 1/12000. Следовательно, 99,7% результатов должны подпадать под +/- 3 стандартных отклонения среднего значения, т. Е. В диапазоне 0,5 +/- 0,0274.

Это смехотворно неэффективный способ получения нормалей. Лучшие альтернативы включают метод Box-Muller, метод Polar или метод ziggurat.

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