randomize();
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [18.97.9.174] |
|
|
правила раздела Алгоритмы

randomize();
|
Сообщ.
#1
,
|
|
|
|
Привет Люди
.Не подскажите что представляет из себя функция randomize() и random()то биш по какому алгоритму генерируются случайные числа?? |
|
Сообщ.
#2
,
|
|
|
|
Функция Randomize просто устанавливает начальное значение для веременной RandSeed. Вот как она описана в Делфи 6:
![]() ![]() procedure Randomize; {$IFDEF LINUX} begin RandSeed := _time(nil); {$ENDIF} {$IFDEF MSWINDOWS} var systemTime : record wYear : Word; wMonth : Word; wDayOfWeek : Word; wDay : Word; wHour : Word; wMinute : Word; wSecond : Word; wMilliSeconds: Word; reserved : array [0..7] of char; end; asm LEA EAX,systemTime PUSH EAX CALL GetSystemTime MOVZX EAX,systemTime.wHour IMUL EAX,60 ADD AX,systemTime.wMinute { sum = hours * 60 + minutes } IMUL EAX,60 XOR EDX,EDX MOV DX,systemTime.wSecond ADD EAX,EDX { sum = sum * 60 + seconds } IMUL EAX,1000 MOV DX,systemTime.wMilliSeconds ADD EAX,EDX { sum = sum * 1000 + milliseconds } MOV RandSeed,EAX {$ENDIF} end; |
|
Сообщ.
#3
,
|
|
|
|
_randseed := _randseed * 214013 + 2531011 mod 232
random := _randseed div 216 вернуть random деление нужно для того, чтобы уменьшить предсказуемость младших битов random |
|
Сообщ.
#4
,
|
|
|
|
Сейчас посмотрел в отладчике, как работает стандартная функция Random, получил примерно такой код:
![]() ![]() function iRandom(A:LongInt):LongWord; var i:LongWord; j:Int64; begin i:=RandSeed*$8088405+1; RandSeed:=i; j:=Int64(i)*A; iRandom:=j shr 32; end; |
|
Сообщ.
#5
,
|
|
|
|
Ну множитель и сдвиг другие, ето понятно...
но почему shr 32? ![]() --- тьфу ты... 64 бита. Ето в каком? в fpc 64-разр. рандом? Или в tmt? |
|
Сообщ.
#6
,
|
|
|
|
Takoi generat bul v pervuh rersiyah stl ():
class Randint { unsigned long randx;//Ravnomernoe raspredelenie [0,max] public: Randint(long s=0){randx=s;} void seed(long s){randx=s;} //privedennue magi4eskie 4isla nujnu dlya //vudeleniya 31 bita iz 32-bitnogo long long abs(long x){return x&0x7fffffff;} static double max(){return 2147483648.0;} long draw(){return randx=randx*1103515245+12345;} double fdraw(){return abs(draw()/max());} long operator(){return abs(draw());} }; Vo vsyakom tak stait v Straustrup'e(3-e izdanie). |
|
Сообщ.
#7
,
|
|
|
|
Цитата Visitor, 20.10.03, 23:31:22 Ну множитель и сдвиг другие, ето понятно... но почему shr 32? ![]() --- тьфу ты... 64 бита. Ето в каком? в fpc 64-разр. рандом? Или в tmt? Может я чего то и напутал при переводе в паскаль, в оригинале (в файле скомпилированном Делфи6) функция была такой: ![]() ![]() ; IN: EAX ; OUT: EAX push ebx xor ebx,ebx imul edx,[ebx+RandSeed],$8088405 inc edx mov [ebx+RandSeed],edx mul edx mov eax,edx pop ebx ret |
|
Сообщ.
#8
,
|
|
|
|
Угу... А я и не думал, что борланд с микрософтом в етом направлении почесаться могут
)) |