UnmannerПросто вопрос у вас выглядит как-то глупо.
Пока на паскале
Код:
// Равномерное распределение на отрезки 0..1
function MyRandom:Real;
begin
MyRandSeed:=(MyRandSeed*$08088405+1); //MyRandSeed- сучайное число на придыдущщем шаге
Result:=MyRandSeed*(1.0/$10000) / $10000; // Rand - Случайное число в диапозоне [0..1]
end;
function MyRandom(m:Integer):Integer; Overload;
begin
MyRandSeed:=(MyRandSeed*$08088405+1); //MyRandSeed- сучайное число на придыдущщем шаге
Result:=MyRandSeed mod m; // Rand - Случайное число
end;
function MyRandomInteger:Integer;
begin
MyRandSeed:=(MyRandSeed*$08088405+1); //MyRandSeed- сучайное число на придыдущщем шаге
Result:=MyRandSeed; // Rand - Случайное число
end;
var
IsTwoNorm:Boolean=False;
TwoNorm:Real;
// Нормальное распределение
function MyRandomNorm:Real;
var s,u,v:Real;
begin
if IsTwoNorm then
begin
Result:=TwoNorm;
IsTwoNorm:=False;
end else
begin
repeat
u:=MyRandom*2-1; // получается из равномерного распределения
v:=MyRandom*2-1;
s:=u*u+v*v;
until s<=1;
TwoNorm:=v*sqrt(-2*ln(s)/s);
isTwoNorm:=True;
Result:=u*sqrt(-2*ln(s)/s);
end;
end;
// Нормальное распределение оно же гауссовское
function RandomNorm(Mean,StdDev:Real):Real;
begin
Result:=MyRandomNorm*StdDev+Mean;
end;
с++
Код:
bool IsTwoNorm;
double TwoNorm;
double
MyRandomNorm ()
{
double s,u,v;
if (IsTwoNorm) {
return TwoNorm;
IsTwoNorm=false;
} else
{
do {
u=(rand()/(RAND_MAX)*2-1;
v=(rand()/(RAND_MAX)*2-1;
s=u*u+v*v;
} while (s<=1.0);
TwoNorm=v*sqrt(-2*ln(s)/s);
isTwoNorm=true;
return u*sqrt(-2*ln(s)/s);
};
};
double RandomNorm2(double Mean,StdDev)
{
return MyRandomNorm()*StdDev+Mean;
}
Надеюсь правильно на Си перевел. Сейчас времени нет проверить.