2017-02-11 6 views
4

私は自分のクラスのC++割り当てに取り組んでおり、rand()を99のシードで使用して値のセットを生成する必要があります。しかし、私の問題は、私たちのパラメータ内に値を作成しようとすると、その数はインストラクターが明確な最初の数を提供したものとは異なることです。 コードは以下の通りである:生成することが予想される数は、これが異なる理由としてすべてのヘルプは素晴らしいだろう2で感謝しながら、これから作らC++ rand()はシードに基づいて正しい数値を提供していません

int lottoNumber; 
    srand (RANDOM_NUMBER_SEED); 
    do 
    { 
    lottoNumber = rand(); 
    } while (lottoNumber > 25 || lottoNumber < 1); 

    cout << lottoNumber << endl; 

値は、13です!

+0

おそらくループを取り除いて、 'lottoNumber = rand()%25 + 1;'を使うだけです。それは完全には配布されていないかもしれませんが、実際の宝くじ以外のものでなければなりませんが、実際の宝くじであれば、政府の規制にはPRNGよりも良いものが必要と思われます:-) – paxdiablo

答えて

9

rand()で使用されるアルゴリズムは、実装定義です。

これは、異なるコンパイラとコンパイラのバージョンで異なる可能性があることを意味します。

3

rand()がcppreference.com std::randから、実装に依存する:

が生成ランダムシーケンスの品質に関しては一切の保証はありません。

あなたはより多くのstdようなものを使用することをお勧めします:: MT19937

4

あなたのインストラクターが幻覚れます。これは擬似ランダム番号ジェネレータです。そのようなジェネレータのプロパティは、プログラムの特定の呼び出しで同じシードが与えられた場合と同じ結果を生成する傾向があるため、この動作が何らかの形で保証されていることを意味するわけでも、同じプロパティが適用される一般的に永遠に。

確定的なシーケンスが必要な場合は、乱数ジェネレータを使用しないでください。

+0

乱数発生器rand srand()によって設定された値に依存して、通常は完全に確定的です。実際、これはいくつかの便利な機能の1つです。 –

+0

@NeilButterworth:OPは、実際にはこれが本当ではないことを発見しました。 –

+0

確定的!=すべての実装で同じ結果が得られます –

関連する問題