所以我实际上要做的是在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;
Run Code Online (Sandbox Code Playgroud)
你没有任何循环语法,所以这肯定是你混淆的可能来源.
不要Randomize多次打电话.它会在每次执行时重新初始化随机种子,这取决于系统时钟.如果你的代码运行得比时钟提前快,那么你的几次调用Randomize实际上会将随机种子重置为之前的相同值,从而导致重复Random调用返回相同的值.
帮助建议您Randomize在程序开始时只调用一次.如果您正在编写一个单元或组件,并且您不负责整个程序,那么根本不要打电话Randomize.相反,请记录代码的使用者应该自己调用它.
如果您正在编写DLL而不使用运行时包,则调用RandomizeDLL导出的初始化函数; 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;
Run Code Online (Sandbox Code Playgroud)