質問
だから、私は基本的にやろうとしていることはそれが理にかなっているが、私のアプリは、アクションIのいずれかを実行していないようならば、他のいくつかは、時間の10%ずつを起こる、何かが時間の70%が起こる持っています「誰が見てみると、おそらく私にいくつかのアドバイスを与えることができる、とにかく場合、私はループ構文か何かを誤解しています推測します。
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;
解決
あなたは任意のループ構文を持っていないので、それは確かにあなたの混乱の可能性のあるソースです。
を複数回Randomize
呼び出さないでください。これは、ランダムシードあなたがやるたびに再初期化し、そのシステムクロックに基づいています。あなたのコードが高速クロックの進歩よりも実行されている場合は、あなたのいくつかの呼び出しが実際にがリセットされますRandomize
するのそれは同じ値を返す繰り返しRandom
呼び出し、その結果、以前と同じ値にランダムシードます。
ヘルプは、あなたのプログラムの開始時に一度だけRandomize
を呼び出すようにアドバイスします。あなたはユニットまたはコンポーネントを書いていると、あなたがプログラム全体を担当していない場合は、まったくRandomize
を呼び出すことはありません。代わりに、あなたのコードの消費者は、それ自体を呼び出す必要があることを文書化します。
、そのあなたのDLLエクスポート初期化関数でRandomize
を呼び出します。あなたのDLLの消費者は、DelphiランタイムライブラリのあなたのDLLのコピーにアクセスすることはできません。
あなたが何かは、時間の70%が起こるしたい場合も、あなたはあなたの価値があるかどうかを確認する必要があります。のより厳密に小さいのRandom
の可能な戻り値がゼロを含める70。結果の70%が0と69包括の間になります。許可70が実際にイベントが時間の71パーセントが起こるようになります。
最後に、時間の10パーセントのあなたの計算は私には意味がありません。あなたは3時間の7%が起こるのだろうイベント、および時間の9パーセントが起こるのだろうものを持っています。あなたが唯一の残り30%を持っている場合、それぞれが時間の10パーセントが起こる4つのイベントを持つことができません。あなたは、独立して、他の測定される各イベントの周波数のために意味するのですか?もしそうなら、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;