ホームページ >バックエンド開発 >C++ >C で真の乱数を生成する方法 : `rand()` だけで十分ですか?

C で真の乱数を生成する方法 : `rand()` だけで十分ですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-24 00:21:20289ブラウズ

How to Generate Truly Random Numbers in C  :  Is `rand()` Enough?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。