C ++で何かが起こる確率が1/4であるかどうかを計算する最良の方法は?
-
11-07-2019 - |
質問
見つけるための賢い方法があるかどうか疑問に思っていました
何かが起こる確率は1/4です。
rand()%4でこれを行うことができ、0に等しいかどうかを確認できますが、rand()を使用しない方法はありますか? C ++では、ありがとう。
正しい解決策はありません
他のヒント
多くのrand()
実装に内在するクラッピーを避けたい場合は、おそらくブーストランダムライブラリには、いくつかの高品質のpRNG(擬似乱数ジェネレータ)と、出力を制御する多くの方法があります。このライブラリは、わずかに変更された形式でstd::tr1
にも存在します。
Never ever は、PRNG値を範囲に切り捨てるために%を使用します。ほとんどのPRNGには、比較的ランダムではない下位ビットがあります。
あなたのケースでは、BCSが示唆するように除算(RAND_MAX / n)を使用します。
rand() < RAND_MAX/n;
Cの標準rand()が気に入らない場合は、Cよりも優れたrand()を選択してください。
独自のランドを書くことができます。 (いけない)。
ティックカウントを取得できます。 (あまり頻繁にしないでください)。
数えるだけで、4回の呼び出しごとにtrueが返されます。
おそらくrand()を呼び出すだけです。
C ++をあまり知らないので、間違っているかもしれません。しかし、rand()
は0
とRAND_MAX-1
の間の値を返すようです。そのため、次のようなことができます:
double odds = .25;
if(rand() <= RAND_MAX * odds) {
// there should be .25 chance of entering this condition
}
PS:キャストが必要な場合があります。
rand()を使用しないのはなぜですか? <!> quot; true <!> quotが気になる場合ランダムネスと擬似ランダムネス、を使用して試すことができますランダムビットの物理的なソース。はるかに複雑で、通常は不要です。
全体的なエントロピーが向上した Mersenneツイスターなど、別のタイプのRNGを使用できます。 Multuply with Carry RNGについても良いことを聞きました。
4は特殊なケースです。 PRNGが50%の確率で偶数を出力する可能性があると仮定できます。これは、libc(rand)のLCGの場合です。したがって、偶数を2回出力する確率は25%です。
したがって...
bool rand_afourth(void)
{
return !!((rand() & 1) & (rand() & 1));
}
そして、今では物足りない...
やりたいことは、一定のランダムに生成されたものですが、特定の範囲、この場合は4のエントロピーに制限されています。PRNGがたとえば32ビットのエントロピーを持っている場合、出力mod 4の計算は期待どおりに機能します。これにはもう少し作業が必要です。
幸いなことに、この作業はboostライブラリに既に実装されています。
boost::uniform_int<> aFourth(1,4)
そして、たとえば<!> quot; ok <!> quot; 1を取得するたびに(または2、3、4、空想の場合)。
ただし、boostライブラリを使用する必要はありません。次に、 uniform_intのコードを見て、動作を再現します。才能は模倣し、天才は盗みます。 ;)
うーん...独自のrand()
を書きますか? 何らかの種類のランダム関数が必要になります!
試してください:
static int r = 0;
: : :
if ((r = (r+1)%4) == 0) {
// do something.
}
その後、何かが発生する確率が完全に25%になることがわかります(ifステートメントを4回の倍数で実行すると仮定します。
<!> lt; / humor <!> gt;