随机种子(randseed)
当random(5)指定random range为5时,产生的一系列随机数的序列是相同的(其中的序列值在0-4之间,由random range决定,且这一序列会出现重复值)。在调试情况下,你去查看random(5)的每次执行的值构成的序列和下一次运行程序执行到random(5)产生的序列是相同的。因为系统的随机数种子不变。
得出结论:
系统随机数是伪随机数,在使用相同的随机数种子的时候,系统内部采用的随机数算法是固定的,那么产生的随机数序列都是相同的。随机数种子作为初始值参与随机数算法计算,得到的结果加入作为第二次的随机数种子,依次得到随机数序列。
不同语言的随机数random函数用法不一样,但是原理都是相近的。
随数种子是用来打乱随机数的,所以要想得到不同的随机数序列,一般种子采用系统的芯片时间GetTickCount。delphi类库提供Randomize函数来改变随机数种子,其内部实现如下:
procedure Randomize;
{$IFDEF LINUX}
begin
RandSeed := _time(nil);
end;
{$ENDIF}
{$IFDEF MSWINDOWS}
var
Counter: Int64;
begin
if QueryPerformanceCounter(Counter) then
RandSeed := Counter
else
RandSeed := GetTickCount;
end;
{$ENDIF}
{$IFDEF LINUX}
begin
RandSeed := _time(nil);
end;
{$ENDIF}
{$IFDEF MSWINDOWS}
var
Counter: Int64;
begin
if QueryPerformanceCounter(Counter) then
RandSeed := Counter
else
RandSeed := GetTickCount;
end;
{$ENDIF}