О генераторе случайных чисел
Например (решение в лоб):
берешь числа -5, -4.99, -4.98, ..., +5, считаешь для них вероятность по гауссу, умножаешь каждое на большое число (чтобы получилось целое) и называешь их, допустим, P[-5], P[-4.99], ...
Потом берешь равномерно случайное целое на отрезке [0, Sum(P[j])], и выдаешь то j, в интервал (P[j], P[j+0.01]) у тебя попало это случайное
берешь числа -5, -4.99, -4.98, ..., +5, считаешь для них вероятность по гауссу, умножаешь каждое на большое число (чтобы получилось целое) и называешь их, допустим, P[-5], P[-4.99], ...
Потом берешь равномерно случайное целое на отрезке [0, Sum(P[j])], и выдаешь то j, в интервал (P[j], P[j+0.01]) у тебя попало это случайное
В среду постараюсь скинуть прогу на алголе.
В "Study" FAQ.
GNU SL это уже умеет.
---
...Я работаю антинаучным аферистом...
GNU SL это уже умеет.
---
...Я работаю антинаучным аферистом...
1)Берешь случайное число x в интервале [0,1] (с равновероятным распределением)
2)Придумываешь такую фукнцию - отображение отрезка [0,1] на вещественную ось, которая превращает равномерное распределение в гаусса
2)Придумываешь такую фукнцию - отображение отрезка [0,1] на вещественную ось, которая превращает равномерное распределение в гаусса
Это из Numerical Recipies in Fortran/C/C++.
случайные числа распределены по Гауссу с sigma=1 и <x> = 0.
r->Random возвращает случайные числа равномерно распределенные в промежутке [0,1).
случайные числа распределены по Гауссу с sigma=1 и <x> = 0.
r->Random возвращает случайные числа равномерно распределенные в промежутке [0,1).
double GaussRandom::Random {
static int iset = 0;
static double gset;
double fac, rsq, v1, v2;
if(iset == 0) {
do {
v1 = 2.0*r->Random - 1.0;
v2 = 2.0*r->Random - 1.0;
rsq = v1*v1+v2*v2;
} while (rsq >= 1.0 || rsq == 0.0);
fac = sqrt(-2.0*log(rsq)/rsq);
gset = v1*fac;
iset = 1;
return v2*fac;
} else {
iset = 0;
return gset;
}
}
Сумма большого числа независимых равномерно распределенных случайных величин распределена по Гауссу.
Среднее - середина интервала, ясное дело. Как дисперсия связана с длиной интервала надо подумать.
Это самый простой и быстрый способ.
Среднее - середина интервала, ясное дело. Как дисперсия связана с длиной интервала надо подумать.
Это самый простой и быстрый способ.
Это самый простой и быстрый способ.Может он и простой, но наверняка не самый быстрый.
самый простой - генерить phi - равномерно распределенное на [0;1) и r равномерно распределенное там же, тогда x=cos(2*pi*phi)*(1-log(r будет нормально распределено... кажись так.
Всем спасибо! Оказывается в Delphi есть такая функция, которая мне нужна. RandG называется. Ура!
А есть ли хороший несложный генератор случайных числел в целочисленной арифметике? Чтобы выдавал целые числа от 0 до 2^31 - 1. В алгоритме допустимы несложные команды(сложение, вычитание, сдвиг, возможно умножение недопустимы сложные (вроде деления) - чтобы на ассемблере можно было реализовать?
нет.
зато есть куча генераторов псевдослучайных числел. Как раз основанные на таких операциях. Google наверняка найдет то что тебе нужно
зато есть куча генераторов псевдослучайных числел. Как раз основанные на таких операциях. Google наверняка найдет то что тебе нужно

а в форуме никто не владеет секретом?
я вот знаю один, но хочу посмотреть другие

я вот знаю один, но хочу посмотреть другие

Предупреждаю всех на будущее: за скриншоты текстовой информации буду плюсовать.
Кстати, о пользе чтения FAQ-ов.
---
...Я работаю антинаучным аферистом...
---
...Я работаю антинаучным аферистом...
Оставить комментарий
Elmor
Помогите, кто может! Нужно составить функцию, генерирующую случ числа. Так, чтобы наиболее вероятно функция выдавала ноль, менее вероятно числа близкие к нулю... В общем подчинялась гауссовскому распределению с заданной пользователем дисперсией.