スマートに調べる方法がないか考えてみた
1/4の確率で何かが起こる。
rand() % 4 を使用してこれを実行し、それが 0 に等しいかどうかを確認できることはわかっていますが、rand() を使用しない方法はありますか? C ++で、ありがとう。
スマートに調べる方法がないか考えてみた
1/4の確率で何かが起こる。
rand() % 4 を使用してこれを実行し、それが 0 に等しいかどうかを確認できることはわかっていますが、rand() を使用しない方法はありますか? C ++で、ありがとう。
多くの実装に内在する安っぽさを避けたい場合は、おそらくBoost Random ライブラリrand()
を調べる必要があります。これには、いくつかの高品質の pRNG (疑似乱数ジェネレーター) と、出力を制御する多くの方法があります。このライブラリは、わずかに変更された形で にも存在します。std::tr1
PRNG値を範囲に切り捨てるために%を使用しないでください。ほとんどのPRNGには、比較的ランダムではない下位ビットがあります。
あなたの場合、BCSが提案するような除算(RAND_MAX / n)を使用してください。
rand() < RAND_MAX/n;
Cの標準のrand()が気に入らない場合は、Cよりも優れた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:多分これはいくつかのキャストが必要です。
自分のランドを書くことができます。(しないでください)。
ティックカウントを取得できます。(あまり頻繁にしないでください)。
カウントするだけで、4 回の呼び出しごとに true が返されます。
おそらく、rand() を呼び出すだけでよいでしょう。
4は特殊なケースです。PRNGが偶数を出力する可能性が50%あると想定できます。これは、libc(rand)のLCGの場合です。したがって、偶数を2回出力する確率は25%です。
したがって...
bool rand_afourth(void)
{
return !!((rand() & 1) & (rand() & 1));
}
そして今、衒学者のために...
均一なランダムを生成しますが、特定の範囲(この場合はエントロピーは4)に制限します。PRNGのエントロピーが32ビットの場合、出力を計算することは確実ではありません。 mod4は期待どおりに機能します。これにはもう少し作業が必要です。
幸い、この作業はすでにBoostライブラリに実装されています。
boost::uniform_int<> aFourth(1,4)
そして、たとえば、1(または2、3、4)を取得するたびに「OK」と言います。
ただし、Boostライブラリは使用したくない場合があります。次に、uniform_intのコードを見て、動作を再現します。才能は模倣し、天才は盗みます。;)
rand() を使用しないのはなぜですか? 「真の」ランダム性と疑似ランダム性が気になる場合は、ランダム ビットの物理ソースを使用してみてください。はるかに複雑で、通常は不要です。
全体的なエントロピーが優れているメルセンヌツイスターなど、別のタイプの RNG を使用できます。また、 Multuply with Carry RNGについても良いことを耳にします。
試す:
static int r = 0;
: : :
if ((r = (r+1)%4) == 0) {
// do something.
}
次に、何かが起こる完全な 25% の確率が得られることがわかります (if ステートメントを 4 の倍数実行すると仮定します。
</ユーモア>
うーん...自分で書くrand()
?ある種のランダム関数が必要になります!