C で真の乱数を生成する方法
サイコロを振るゲームなど、乱数の生成が必要なアプリケーションを開発する場合、生成される数値が真にランダムであり、特定の値に偏っていないことを確認することが重要です。
コード質問に示されているスニペットは、 rand() 関数を使用して、指定された範囲内の乱数を生成します。ただし、出力で観察されるように、同じ数値が繰り返し生成され、ランダム性の欠如を示しています。
問題:
この問題は、モジュロの使用から発生します。演算子 (%) を使用して、乱数を特定の範囲にマッピングします。このアプローチは便利に見えるかもしれませんが、乱数生成器の実装によってはバイアスが生じる可能性があります。
解決策:
この問題に対処し、C で真の乱数を生成するにはの場合は、C 11 で導入された機能を利用することをお勧めします。次のコードは、別のアプローチを示しています。
#include <random> #include <iostream> int main() { std::random_device dev; std::mt19937 rng(dev()); std::uniform_int_distribution<std::mt19937::result_type> dist6(1, 6); // distribution in range [1, 6] std::cout << dist6(rng) << std::endl; }
このコードでは、 std::random_device クラスは、メルセンヌ ツイスター乱数ジェネレーター (std::mt19937) を初期化するためのエントロピーのソースを提供します。 std::uniform_int_distribution クラスは、目的の範囲 (この場合は [1, 6]) 内に分布オブジェクトを作成します。
dist6(rng) を呼び出すと、指定された範囲内で真にランダムな整数が生成されます。これらの C 11 機能を採用することで、開発者はよりランダム性を高め、アプリケーションでの偏った結果を回避できます。
以上がC で真の乱数を生成する方法 : `rand()` だけで十分ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。