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

必要なことを行うために、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 に答える
6

ループ構文がないため、間違いなく混乱の原因となる可能性があります。

何度も電話しないでくださいRandomize。毎回ランダムシードを再初期化しますが、これはシステムクロックに基づいています。コードが時計の進む速度よりも速く実行される場合、 を何度か呼び出すと、Randomize実際にはランダム シードが以前と同じ値にリセットされRandom、呼び出しが繰り返されて同じ値が返されます。

Randomizeヘルプでは、プログラムの開始時に 1 回だけ呼び出すことをお勧めします。ユニットまたはコンポーネントを作成していて、プログラム全体を担当していない場合は、まったく呼び出さないRandomizeでください。代わりに、コードの消費者が自分で呼び出す必要があることを文書化してください。

ランタイム パッケージを使用せずに DLL を作成している場合はRandomize、DLL がエクスポートする初期化関数を呼び出します。DLL のコンシューマは、Delphi ランタイム ライブラリの DLL のコピーにアクセスできません。

また、何かを 70% の確率で発生させたい場合は、値が厳密に 70 未満かどうかを確認する必要があります。 の可能な戻り値にRandomはゼロが含まれます。結果の 70% は 0 から 69 の間になります。70 を許可すると、実際には 71% の確率でイベントが発生します。

最後に、10% の確率というあなたの計算は、私には意味がありません。3 つのイベントが 7% の確率で発生し、1 つのイベントが 9% の確率で発生します。残り 30% しかないときに、それぞれ 10% の確率で発生する 4 つのイベントを持つことはできません。各イベントの頻度を他のイベントとは別に測定するということですか? elseその場合、すべての条件付きテストを;と一緒にリンクしないでください。それぞれに完全に別のifステートメントを使用します。

于 2008-12-15T16:16:09.717 に答える