1

所以我基本上想要做的是让某件事在 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;
4

2 回答 2

6

您没有任何循环语法,因此这肯定是您混淆的可能来源。

不要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语句。

于 2008-12-15T16:16:09.717 回答
6

我刚刚修改了 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;
于 2008-12-15T16:37:19.533 回答