Что нового

[Random] Размышления на тему получение нормально распределенных чисел

Автор
kaster

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Код:
Log(Random())


IMHO это тоже не верно, Ln(0) - ?



Добавлено:
Сообщение автоматически объединено:

Kaster сказал(а):
возможно браузер глючит, но я ниче не вижу

-0.180007334518589
0.729794747560476
-1.4048312260519
-1.35359019484716
0.483299824784077
0.648392081007206
0.0861799534066718
0.423508151159531
-1.17292896846556
-0.0516247525551346
-1.02630722456185
-0.0733908819746407
-0.659096799336869
0.358246149159045
1.04298418186321
-0.992558100504008
1.54637372359042
-0.368271745247627
-0.662969669510869
0.867572604038532
-2.33057170432556
1.06805057113926
-1.31963882695383
-1.08098091940203
0.330643438742445
0.887404589253342
0.437813855650564
1.3277390561886
-0.377056290598163
0.424263864216916
-1.26897948610788
0.751952743151951
1.27096090913936
-0.702672574928529
-0.304044688638876
1.50019572113675
0.636803506972626
-0.365352340625526
0.101487842052685
-0.484057940988953
-1.40791501444777
-1.3794908473738
-1.72938994978061
-0.498399809234422
0.667929256878677
-1.59881583767489
-0.951115458468474
-1.20146267519419
2.34920560381623
-0.871985962972638
-0.26968090126137
0.449622520483933
-1.85458580197192
-2.67454628850377
-0.55070769989057
0.807647967470131
0.0538567956420015
-1.03605467662948
1.80093407607802
0.647316237540539
-1.77756460121584
1.76813058428496
-0.0349889109971487
1.40567184894444
-0.743615741880751
-0.0529745026329178
-1.43602387160808
0.136240146368731
-0.88944953138276
-0.205387623445289
-0.352840692314351
-0.499682896998218
-0.106476391730804
-0.0574712726850859
-1.46161305785883
-0.0708920708729136
0.303191653353569
-1.40242808249054
0.96324476045029
1.84673953149575
-0.405657269697784
1.65182386313226
-0.650207532659323
-1.28683399231827
1.10207633118084
-0.498521963679114
-0.0949353849793158
1.36916491850797
-0.831683731873023
-3.30325147644318
0.184858174298022
-1.75015084660608
0.328152026475383
0.566184923668834
-0.462332696793597
0.138790055702788
0.3429770775534
-1.05477204539162
1.17121829977228
1.50437958885869
 
Автор
kaster

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Yashied [?]
IMHO это тоже не верно, Ln(0) - ?
ну, в нормальном распределении есть бесконечно большие числа. правда вероятность их появлении стремится к нулю бесконечно быстро


Добавлено:
Сообщение автоматически объединено:

это значения $X
после этого тебе еще надо получить $Y, потом поделить все на $Max
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Kaster [?]
ну, в нормальном распределении есть бесконечно большие числа. правда вероятность их появлении стремится к нулю бесконечно быстро

т.е. равна нулю

И все-таки, можешь привести небольшой пример как получить такую гистограмму (массив), как на твоем графике? Уж больно он мне понравился.

:smile:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Эпилог

Ладно, сделал немного по другому.

post_img_008.png


X1, X2 - независимые равномерно распределенные от -1 до 1 случайные числа

И вот собственно, основанная на этом, функция _GRandom():

Код:
Func _GRandom($Min = 0, $Max = 1, $Variance = Default, $Mean = Default)

    Local $D, $X1, $X2, $Result

    If $Min > $Max Then
        Return SetError(1, 0, 0)
    EndIf
    If $Min = $Max Then
        Return $Min
    EndIf
    If $Mean = Default Then
        $Mean = ($Min + $Max) / 2
    EndIf
    If $Variance = Default Then
        $Variance = ($Max - $Min) / 2
    EndIf
    If ($Mean < $Min) Or ($Mean > $Max) Then
        Return SetError(1, 0, 0)
    EndIf
    If $Variance <= 0 Then
        Return SetError(1, 0, 0)
    EndIf
    Do
        Do
            $X1 = Random(-1, 1)
            $X2 = Random(-1, 1)
            $D = $X1 ^ 2 + $X2 ^ 2
        Until $D <= 1
        $Result = $Mean + $X1 * $Variance * Sqrt(-2 * Log($D) / $D)
    Until ($Result >= $Min) And (($Result <= $Max))
    Return $Result
EndFunc   ;==>_GRandom


$Min и $Max - минимальное и максимальное числа, возвращаемые функцией. По умолчанию - 0 и 1 соответственно.

$Variance - Дисперсия, относительно интервала, заданного значениями $Min и $Max. По умолчанию - 0.5.

$Mean - Матиматическое ожидание. По умолчанию - середина интервала, заданного значениями $Min и $Max.

Функция возвращает нормально распределенное случайное вещественное число из заданного диапазона и с заданными десперсией и матиматическим ожиданием. В случае ошибки возвращает 0 и устанавливает флаг @error в 1.

Вот гистограмма для этой функции на участке от -1 до 1 с дисперсией 0.3 и матиматическим ожиданием 0, выборка - 1.000.000 (1М) значений. Построение графика производилось с помощью этой функции.

Код:
_GRandom(-1, 1, 0.3, 0)




Кстати, вот гистограмма стандартного ГСЧ в AutoIt с теми же параметрами.



Как видно, даже для 1M значений, это далеко не прямая.

:smile:
 
Автор
kaster

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Yashied [?]
X1, X2 - независимые равномерно распределенные от -1 до 1 случайные числа
хм... а если Х1 = Х2 = +-1? тогда D = 2. а по поводу -1 до +1 я писал еще давно ;)

Kaster [?]
а в твоем коде учитываются только те, которые попадут в 0, 1. по хорошему надо строить от мин до макс, и в идеале мин=-макс. но т.к. ты делишь потом на макс все, то строить можно и от -1 до 1
а гистограмму я получал следующим образом.
находил 100к точек по формуле указанной мной в пред. сообщениях, потом строил частотную характеристику с помощью пакета Analyze Pak.

Yashied [?]
Как видно, даже для 1M значений, это далеко не прямая.
ну знаешь ли, для стат. анализа эта кривая оооочень даже ничего. эту линию можно смело апроксимировать прямой
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Kaster [?]
хм... а если Х1 = Х2 = +-1?

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

Kaster [?]
ну знаешь ли, для стат. анализа эта кривая оооочень даже ничего. эту линию можно смело апроксимировать прямой

Да, я согласен. Я тут ради интереса проверил функцию RtlRandomEx() из ntdll.dll, и оказалось, что она намного хуже "Вихря Мерсена" - Random(). Вот ее гистограмма для 1M значений.



Тут у меня возникла одна идея... сделать генератор истинно случайных чисел. Шум можно брать с любых аналоговых устройств, например WiFi приемника, звуковой карты и т.д. Но вот как достучаться до этой информации...

А вообще классная тут дискуссия получилась...

:smile:
 

SyDr

Сидра
Сообщения
651
Репутация
158
Yashied [?]
Тут у меня возникла одна идея... сделать генератор истинно случайных чисел
На программном уровне? ;)

Чем же вихря Мерсена не хватает? Использовать AutoIt для криптографиии... ну... как то это неправильно.
http://ru.wikipedia.org/wiki/%D0%92%D0%B8%D1%85%D1%80%D1%8C_%D0%9C%D0%B5%D1%80%D1%81%D0%B5%D0%BD%D0%BD%D0%B0
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
На программном уровне это не получиться, я бы сказал на программно-аппаратном. Нужно получить шум с аналогового тракта (АЦП) звуковой карты, ну а дальше уже понятно.

SyDr [?]
Чем же вихря Мерсена не хватает?

Ну... интереса ради.
 
Верх