我对随机数问题最后解决如下,修改过程:
function crandom(const i:integer):integer;
var j:integer;
begin
randomize;
for j:=1 to 3 do result:=random(i-1)+1;//取第3次的值,也可以是第x次;只要不是第一次
end;
现找到两帖你可以借鉴:
一: http://www.delphibbs.com/delphibbs/dispq.asp?lid=650976
二:发信人: guoer (过儿), 信区: Delphi
标 题: Re: 关于随机数问题
发信站: BBS 水木清华站 (Sat Feb 26 17:23:22 2000)
【 在 darkdark (无为) 的大作中提到: 】
∶ 在DELPHI中随机数函数的功能好象并不随机,每次的结果好象都有规律。
∶ 如何实现真正的随机?(我指的是Random(range)函数)
其实可以自己写一个伪随机数发生器的。
如果需要整数随机数的话,参看下面的线性反馈移位法制作的伪随机数:
function LFSR: integer;
var ShiftRegister: LongWord;
begin
ShiftRegister := 1;
ShiftRegister := ((((ShiftRegister shr 31)
xor (ShiftRegister shr 6)
xor (ShiftRegister shr 2)
xor (ShiftRegister shr 1)
xor ShiftRegister))
and $00000001)
shl 31)
or (ShifteRegister shr 1);
Result := ShiftRegister and $00000001;
end;
如果需要浮点数伪随机数发生器的话,参看下面的线性同余发生器:
随机数范围在-2e31+85 ~ 2e31-85
初始变量s1,s2可以设置在1~2147483398之间
var s1,s2: LongWord;
procedure initLCG(initS1,initS2: LongWord);
begin
s1 := initS1;
s2 := initS2;
end;
procedure MODMULT(a,b,c,m: LongWord; var s: LongWord);
var q: LongWord;
begin
q := s div a;
s := b*(s-a*q)-c*q;
if (s<0) then s := s+m;
end;
function combinedLCG: double;
var z: LongWord;
begin
MODMULT(53668,40014,12211,2147483563,s1);
MODMULT(52774,40692,3791,2147483399,s2);
z := s1-s2;
if z<1 then
z := z+2147483562;
Result := z*4.656613E-10;
end;
initialization
s1 := 1;
s2 := 1;
----