关于取随机数的奇怪问题

liounzhou 2002-06-15 11:07:58
请建立一个Form,上面有两个Memo和一个Button。自定义函数如下:
function TForm1.GetRandomTableName: String;
var
iNum,iCyc,:Integer;
StrNum:String;
begin
iNum:=111111111;

Result:='';
StrNum:=IntToStr(iNum);
ShowMessage(StrNum);
For iCyc:=1 to Length(StrNum) do
Result:=Result+Chr(RandomInc(Ord(StrNum[iCyc])));
end;

function TForm1.RandomInc(iValue:Integer): Integer;
var
iRan:Integer;
begin
Repeat
Randomize;
iRan:=Random(8,74);
FormTest.Memo1.Lines.Add(IntToStr(iRan));
//ShowMessage(IntToStr(iRan));
Until (((iValue+iRan)>=65) and ((iValue+iRan)<=90)) or
(((iValue+iRan)>=97) and ((iValue+iRan)<=122));

Result:=(iValue+iRan);
end;

在Button的点击事件中激发第一个函数,然后看看两个Memo的内容;将第二个函数中的ShowMessage去掉注释,再执行一次,看看Memo有什么不同?
第一次没有ShowMessage的时候,每次调用第二个函数取到的值都是一样的,加上ShowMessage后就不一样了。哪位大虾能告诉我是什么原因?
...全文
40 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
GreenWaterBlueSky 2002-06-17
  • 打赏
  • 举报
回复
不是放在循环的外面,而是整个程序只用一次Randomize;也就是说在程序初始化
(比如在主窗体创建时)的时候调用一次Randomize;以后就不再调用Randomize了
liounzhou 2002-06-16
  • 打赏
  • 举报
回复
To GreenWaterBlueSky(碧水蓝天我的家):
我已经把Randomize放在循环的外面,可是还是不行啊。另外,iRan:=Random(8,74)本来是想写为iRan:=RandomRange(8,74)的。
S_caijing 2002-06-15
  • 打赏
  • 举报
回复
Randomize;
放在循环外
lxl 2002-06-15
  • 打赏
  • 举报
回复
同意楼上观点,
也可使用循环变量作为种子
GreenWaterBlueSky 2002-06-15
  • 打赏
  • 举报
回复
实际上Random是有一个数作为产生随即数的种子,如果没有Randomize则用默认的值,下次调用Random时用上次的随即数作为种子,
Randomize是产生随即数的种子,它是依靠当前系统时间,
没有ShowMessage的话,那么当前时间可能没有变化,所以产生随即数的种子可能没有变,对于一个进程应该只执行一次Randomize就够了;
另外这句话iRan:=Random(8,74)是不是想写为iRan:=Random(874)

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧