2

スマートに調べる方法がないか考えてみた

1/4の確率で何かが起こる。

rand() % 4 を使用してこれを実行し、それが 0 に等しいかどうかを確認できることはわかっていますが、rand() を使用しない方法はありますか? C ++で、ありがとう。

4

11 に答える 11

11

多くの実装に内在する安っぽさを避けたい場合は、おそらくBoost Random ライブラリrand()を調べる必要があります。これには、いくつかの高品質の pRNG (疑似乱数ジェネレーター) と、出力を制御する多くの方法があります。このライブラリは、わずかに変更された形で にも存在します。std::tr1

于 2008-11-28T22:32:05.240 に答える
9

PRNG値を範囲に切り捨てるために%を使用しないでください。ほとんどのPRNGには、比較的ランダムではない下位ビットがあります。

あなたの場合、BCSが提案するような除算(RAND_MAX / n)を使用してください。

于 2008-11-28T22:52:33.637 に答える
5

乱数発生器

于 2008-11-28T22:23:47.113 に答える
4
rand() < RAND_MAX/n;

Cの標準のrand()が気に入らない場合は、Cよりも優れたrand()を選択してください。

于 2008-11-28T22:50:39.743 に答える
3

私はC++をあまり知らないので、間違っているかもしれません。しかし、とのrand()間の値を返すようです。だから多分あなたはこのようなことをすることができます:0RAND_MAX-1

double odds = .25;

if(rand() <= RAND_MAX * odds) {
    // there should be .25 chance of entering this condition
}

PS:多分これはいくつかのキャストが必要です。

于 2008-11-29T00:16:04.640 に答える
3

自分のランドを書くことができます。(しないでください)。
ティックカウントを取得できます。(あまり頻繁にしないでください)。
カウントするだけで、4 回の呼び出しごとに true が返されます。

おそらく、rand() を呼び出すだけでよいでしょう。

于 2008-11-28T22:24:11.310 に答える
1

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のコードを見て、動作を再現します。才能は模倣し、天才は盗みます。;)

于 2008-11-29T10:14:32.763 に答える
1

rand() を使用しないのはなぜですか? 「真の」ランダム性と疑似ランダム性が気になる場合は、ランダム ビットの物理ソースを使用してみてください。はるかに複雑で、通常は不要です。

于 2008-11-28T22:31:59.187 に答える
1

全体的なエントロピーが優れているメルセンヌツイスターなど、別のタイプの RNG を使用できます。また、 Multuply with Carry RNGについても良いことを耳にします。

于 2008-11-28T23:11:26.440 に答える
0

試す:

static int r = 0;
: : :
if ((r = (r+1)%4) == 0) {
    // do something.
}

次に、何かが起こる完全な 25% の確率が得られることがわかります (if ステートメントを 4 の倍数実行すると仮定します。

</ユーモア>

于 2008-11-28T23:29:03.767 に答える
0

うーん...自分で書くrand()ある種のランダム関数が必要になります!

于 2008-11-28T22:24:11.683 に答える