Njcs сказал:
А еще я заметил что функция rnd в бейсике располагает звезды примерно на одних и тех же местах, Поэтому в версии MSX использовали rnd(time)
Вот в последней версии DELPHI реализован RND в исходниках модуля system, так:
// версия для целых чисел диапазон (0,ARange)
function Random(const ARange: Integer): Integer;
var
Temp: Longint;
begin
Temp := RandSeed * $08088405 + 1;
RandSeed := Temp;
Result := (UInt64(Cardinal(ARange)) * UInt64(Cardinal(Temp))) shr 32;
end;
//-----------------------------------------------------
// версия для вещественных чисел диапазон (0,1)
function Random: Extended;
const
two2neg32: double = 0.00000000023283064365386962890625; // 2^-32
var
Temp: Longint;
F: Extended;
begin
Temp := RandSeed * $08088405 + 1;
RandSeed := Temp;
F := Int64(Cardinal(Temp));
Result := F * two2neg32;
end;
Если не обращать внимание на преобразования типов целых чисел integer, UInt64, Int64, Cardinal, longint - которые отличаются разрядностью и знаковостью, то...
Как видно, - только умножения и сдвиг, а $08088405 - это "магическое" простое число. RandSeed - внутренний регистр, где хранится опорное число для этого генератора. Соответственно, можно воспроизводить одинаковую последовательность просто присвоив вначале программы ему что-то, к примеру RandSeed:=1
Функция Randomize - записывает туда в RandSeed - системное время
Так что, даже в современной версии - звезды появлялись бы также
Сообщение отредактировал Nic: 27 Август 2015 - 13:25