Генерирование псевдослучайных чисел с равномерным законом распределение
Подскажите, пожалуйста, как сгенерировать 100 чисел с равномерным законом распределения?
Делаю так, но в результате получаю нормальный закон распределения
/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .delphi.geshi_code {font-family:monospace;} .delphi.geshi_code .imp {font-weight: bold; color: red;} .delphi.geshi_code .kw1 {color: #000000; font-weight: bold;} .delphi.geshi_code .kw2 {color: #000000; font-weight: bold;} .delphi.geshi_code .kw3 {color: #000066;} .delphi.geshi_code .kw4 {color: #000066; font-weight: bold;} .delphi.geshi_code .co1 {color: #808080; font-style: italic;} .delphi.geshi_code .co2 {color: #008000; font-style: italic;} .delphi.geshi_code .coMULTI {color: #808080; font-style: italic;} .delphi.geshi_code .es0 {color: #ff0000; font-weight: bold;} .delphi.geshi_code .br0 {color: #000066;} .delphi.geshi_code .sy0 {color: #000066;} .delphi.geshi_code .sy1 {color: #000066;} .delphi.geshi_code .sy2 {color: #000066;} .delphi.geshi_code .sy3 {color: #000066;} .delphi.geshi_code .st0 {color: #ff0000;} .delphi.geshi_code .nu0 {color: #0000ff;} .delphi.geshi_code .me1 {color: #006600;} .delphi.geshi_code .re0 {color: #9ac;} .delphi.geshi_code .re1 {color: #ff0000;} .delphi.geshi_code span.xtra { display:block; }
function f(x:extended):real;
begin
Result := 1/100;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
x : tarray;
i,j : integer;
rand,sum : real;
file_txt : textfile;
begin
AssignFile(file_txt,'gen.txt');
rewrite(file_txt);
//интервалы и вероятность попадания в них
for i:=1 to 100 do
begin
x[i] := f( i );
//Writeln(file_txt,FloatToStr( x[i] ));
end;
// Writeln(file_txt, ' Конец ');
For i:=1 to 100 do
begin
rand:=random;
sum:=0;
j:=0;
//ищем в какой интервал попало
repeat
inc(j);
sum:= sum + x[j];
// Writeln( file_txt, IntToStr( i ) + ' = ' + IntToStr( j ) + ' -- ' + FloatToStr( sum ) + ' / ' + FloatToStr( rand ) );
Until (sum > rand);
//нашли
Writeln( file_txt, FloatToStr( rand + (j-1) ));
end;
CloseFile(file_txt);
ShowMessage('Готово!');
Application.Terminate;
end;
Делаю так, но в результате получаю нормальный закон распределения
/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .delphi.geshi_code {font-family:monospace;} .delphi.geshi_code .imp {font-weight: bold; color: red;} .delphi.geshi_code .kw1 {color: #000000; font-weight: bold;} .delphi.geshi_code .kw2 {color: #000000; font-weight: bold;} .delphi.geshi_code .kw3 {color: #000066;} .delphi.geshi_code .kw4 {color: #000066; font-weight: bold;} .delphi.geshi_code .co1 {color: #808080; font-style: italic;} .delphi.geshi_code .co2 {color: #008000; font-style: italic;} .delphi.geshi_code .coMULTI {color: #808080; font-style: italic;} .delphi.geshi_code .es0 {color: #ff0000; font-weight: bold;} .delphi.geshi_code .br0 {color: #000066;} .delphi.geshi_code .sy0 {color: #000066;} .delphi.geshi_code .sy1 {color: #000066;} .delphi.geshi_code .sy2 {color: #000066;} .delphi.geshi_code .sy3 {color: #000066;} .delphi.geshi_code .st0 {color: #ff0000;} .delphi.geshi_code .nu0 {color: #0000ff;} .delphi.geshi_code .me1 {color: #006600;} .delphi.geshi_code .re0 {color: #9ac;} .delphi.geshi_code .re1 {color: #ff0000;} .delphi.geshi_code span.xtra { display:block; }
function f(x:extended):real;
begin
Result := 1/100;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
x : tarray;
i,j : integer;
rand,sum : real;
file_txt : textfile;
begin
AssignFile(file_txt,'gen.txt');
rewrite(file_txt);
//интервалы и вероятность попадания в них
for i:=1 to 100 do
begin
x[i] := f( i );
//Writeln(file_txt,FloatToStr( x[i] ));
end;
// Writeln(file_txt, ' Конец ');
For i:=1 to 100 do
begin
rand:=random;
sum:=0;
j:=0;
//ищем в какой интервал попало
repeat
inc(j);
sum:= sum + x[j];
// Writeln( file_txt, IntToStr( i ) + ' = ' + IntToStr( j ) + ' -- ' + FloatToStr( sum ) + ' / ' + FloatToStr( rand ) );
Until (sum > rand);
//нашли
Writeln( file_txt, FloatToStr( rand + (j-1) ));
end;
CloseFile(file_txt);
ShowMessage('Готово!');
Application.Terminate;
end;
1 ответов
Вот эта строка выглядит подозрительно:
Writeln( file_txt, FloatToStr( random + (j-1) ));
Вы что тут хотите напечатать? Я вижу, что тут заново получается случайное число (ничего общего печатаемое значение с полученным ранее не имеет) и к нему добавляется номер интервала. Что то тут явно не так :)
Остальной код выглядит более менее нормально.