О генераторе случайных чисел

Elmor

Помогите, кто может! Нужно составить функцию, генерирующую случ числа. Так, чтобы наиболее вероятно функция выдавала ноль, менее вероятно числа близкие к нулю... В общем подчинялась гауссовскому распределению с заданной пользователем дисперсией.

maggi14

Например (решение в лоб):
берешь числа -5, -4.99, -4.98, ..., +5, считаешь для них вероятность по гауссу, умножаешь каждое на большое число (чтобы получилось целое) и называешь их, допустим, P[-5], P[-4.99], ...
Потом берешь равномерно случайное целое на отрезке [0, Sum(P[j])], и выдаешь то j, в интервал (P[j], P[j+0.01]) у тебя попало это случайное

Bird_V

В среду постараюсь скинуть прогу на алголе.

Ivan8209

В "Study" FAQ.
GNU SL это уже умеет.
---
...Я работаю антинаучным аферистом...

Corrector

1)Берешь случайное число x в интервале [0,1] (с равновероятным распределением)
2)Придумываешь такую фукнцию - отображение отрезка [0,1] на вещественную ось, которая превращает равномерное распределение в гаусса

shlyumper

Это из Numerical Recipies in Fortran/C/C++.
случайные числа распределены по Гауссу с 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;
}
}

marriaje

Сумма большого числа независимых равномерно распределенных случайных величин распределена по Гауссу.
Среднее - середина интервала, ясное дело. Как дисперсия связана с длиной интервала надо подумать.
Это самый простой и быстрый способ.

tokuchu

Это самый простой и быстрый способ.
Может он и простой, но наверняка не самый быстрый.

freezer

самый простой - генерить phi - равномерно распределенное на [0;1) и r равномерно распределенное там же, тогда x=cos(2*pi*phi)*(1-log(r будет нормально распределено... кажись так.

Elmor

Всем спасибо! Оказывается в Delphi есть такая функция, которая мне нужна. RandG называется. Ура!

prehack

А есть ли хороший несложный генератор случайных числел в целочисленной арифметике? Чтобы выдавал целые числа от 0 до 2^31 - 1. В алгоритме допустимы несложные команды(сложение, вычитание, сдвиг, возможно умножение недопустимы сложные (вроде деления) - чтобы на ассемблере можно было реализовать?

freezer

нет.
зато есть куча генераторов псевдослучайных числел. Как раз основанные на таких операциях. Google наверняка найдет то что тебе нужно

prehack

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

sergey_m

Предупреждаю всех на будущее: за скриншоты текстовой информации буду плюсовать.

Ivan8209

Кстати, о пользе чтения FAQ-ов.
---
...Я работаю антинаучным аферистом...
Оставить комментарий
Имя или ник:
Комментарий: