有关随机数的为什么?(0分)

  • 主题发起人 主题发起人 bzmouse
  • 开始时间 开始时间
B

bzmouse

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟在论坛上提了一个有关随机数的问题,
得到解答后,编了这样一个程序,每次运
行后产生的结果并不一样,但第一次都是
‘你赢了’,为什么会这样?
源程序:
procedure TForm1.Button1Click(Sender: TObject);
var
a:integer;
m,n:real;
begin
n:=Random;
Randomize;
m:=Random;
a:=Trunc(30*n*m) mod 3;
case a of
0 : form1.edit1.text:='你赢了!';
1 : form1.edit1.text:='平局!';
2 : form1.edit1.text:='你输了!';
end;
 
不会把,我运行你的程序
每次运行结果就不一样
你再仔细看看。
 
每次运
行后产生的结果并不一样,但第一次都是
‘你赢了’
我指的是第一次!!!!
 
你在n:=Random;的前面再加一句
Randomize;
看看运行结果有什么不一样?
 
Randomize 位置不对, 他应该是在Random前调用, 这样才能起到初始化随机数种子的
作用
 
Pascal的随机函数有个缺陷,每次运行都是那几个固定的数值!
我的办法,先让它产生几千或更多的个数以后再用。
 
Randomize
random(2)
 
Randomize在Rondom之前调用与之后调用,有什么区别(结果)?
 
同意tseug, Randomize 要在random前面。
tseug已经说得很清楚了。
 
Randomize 要在random前面!!!!
还有,给个随机的范围罢
 
所谓的随机数的是通过一个种子seed进行函数变化得到的,
用Randomize初始化,保证种子的不重复,否则得到的随机数就重复了。
 
据说即使使用randomize进行初始化,但由于本身依据的是一个伪随机数序列,
所以得到的值仍然是可以预测的.
我一般的做法是取当前的系统时间,然后取秒数作为随机数.
也用过一种比较简单的处理,就是每次用random取随机数时都先调用randomize,然后在
取数个不需要的值.(当然,这里作废的个数也是用同样的方法得到的随机数)
 
>>每次用random取随机数时都先调用randomize
如果两次调用的时间间隔不足1ms,岂不是肯定会得到相同的结果?
>>仍然是可以预测的
呵呵,问题的关健在这里。to bzmouse:我已经在您的另一个帖子中给出了完美的解决方案。
 
你们说得好像都不对,应该这样:
[red]在程序刚启动时调用一次randomize,记住,就一次;[/red]
你在按钮单击事件里调用randomize,虽然每次生成的随机数看起来不一样,
但是有一定规律的,你可以将每次生成的随机数打印出来看看。
可以做个试验:用TIMER在FORM上随机画出Rectangle。
第一种方式:randomize在form的OnCreate里调用;(即只调用一次)
第二种方式:randomize在OnTimer里调用;(每发生timer事件就调用一次)
看看效果。第二种方式产生的效果有明显的规律。
 
时间过长,斑竹代为结束!
 
接受答案了.
 
后退
顶部