所以我实际上要做的是在70%的时间内发生一些事情,如果有意义的话,另外一些事情发生在10%的时间,但我的应用似乎没有做我正在猜测的任何行动无论如何,如果有人可以看看并且可能给我一些建议,我会误解循环语法或其他东西
per1 := 70; per2 := 77; per3 := 84; per4 := 91; per5 := 100; per6 := Random(2) + 1; randomize; RandPer:= Random(100); randomize; RandPer2 := Random(100); if RandPer2 <= 70 then begin If RandPer <= per1 then begin Functiontest(1); end Else If RandPer <= per2 then begin Functiontest(3); end Else begin If RandPer <= per3 then begin Functiontest(5); end Else begin If RandPer <= per4 then begin Functiontest(6); end Else begin If RandPer <= per5 then begin Functiontest(9); end; end; end; end;
Rob Kennedy.. 6
你没有任何循环语法,所以这肯定是你混淆的可能来源.
不要Randomize
多次打电话.它会在每次执行时重新初始化随机种子,这取决于系统时钟.如果你的代码运行得比时钟提前快,那么你的几次调用Randomize
实际上会将随机种子重置为之前的相同值,从而导致重复Random
调用返回相同的值.
帮助建议您Randomize
在程序开始时只调用一次.如果您正在编写一个单元或组件,并且您不负责整个程序,那么根本不要打电话Randomize
.相反,请记录代码的使用者应该自己调用它.
如果您正在编写DLL而不使用运行时包,则调用Randomize
DLL导出的初始化函数; DLL的使用者将无法访问DLL的Delphi运行时库副本.
此外,如果您希望在70%的时间内发生某些事情,那么您应该检查您的值是否严格小于 70.可能的返回值Random
包括零; 70%的结果将介于0和69之间.允许70实际上会使事件在71%的时间内发生.
最后,你10%的时间计算对我来说没有意义.你有三个事件将在7%的时间内发生,而一个事件将在9%的时间内发生.当你只有30%的剩余时间时,你不可能有四个事件发生在10%的时间.你是说每个事件的频率是独立于其他事件来衡量的吗?如果是,那么不要将所有条件测试链接在一起else
; if
每个都使用完全单独的声明.
你没有任何循环语法,所以这肯定是你混淆的可能来源.
不要Randomize
多次打电话.它会在每次执行时重新初始化随机种子,这取决于系统时钟.如果你的代码运行得比时钟提前快,那么你的几次调用Randomize
实际上会将随机种子重置为之前的相同值,从而导致重复Random
调用返回相同的值.
帮助建议您Randomize
在程序开始时只调用一次.如果您正在编写一个单元或组件,并且您不负责整个程序,那么根本不要打电话Randomize
.相反,请记录代码的使用者应该自己调用它.
如果您正在编写DLL而不使用运行时包,则调用Randomize
DLL导出的初始化函数; DLL的使用者将无法访问DLL的Delphi运行时库副本.
此外,如果您希望在70%的时间内发生某些事情,那么您应该检查您的值是否严格小于 70.可能的返回值Random
包括零; 70%的结果将介于0和69之间.允许70实际上会使事件在71%的时间内发生.
最后,你10%的时间计算对我来说没有意义.你有三个事件将在7%的时间内发生,而一个事件将在9%的时间内发生.当你只有30%的剩余时间时,你不可能有四个事件发生在10%的时间.你是说每个事件的频率是独立于其他事件来衡量的吗?如果是,那么不要将所有条件测试链接在一起else
; if
每个都使用完全单独的声明.
我只是修改了CharlesF代码来做你需要的.希望CharlesF不介意.
begin randomize; for i := 0 to NumberOfTimesNeed do begin R := Random(100); case R of 0..69 : Functiontest(1); // this will fire 70% of NumberofTimes 70..79 : Funciotntest(2); // 10 percent 80..89 : Funciotntest(3); // 10 percent 90..94 : Funciotntest(4); // 5 percent // and so on ... end; end;