C ++で何かが起こる確率が1/4であるかどうかを計算する最良の方法は?

StackOverflow https://stackoverflow.com/questions/326797

  •  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()0RAND_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;

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top