Эпилог
Ладно, сделал немного по другому.
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М) значений. Построение графика производилось с помощью
этой функции.
Кстати, вот гистограмма стандартного ГСЧ в AutoIt с теми же параметрами.
Как видно, даже для 1M значений, это далеко не прямая.