C の乱数関数の詳細な説明
乱数はコンピューター プログラミングにおいて重要な役割を果たしており、ランダム イベントのシミュレーションや乱数シーケンスの生成などに使用できます。 . さまざまなアプリケーション。 C 言語には、開発者が乱数を生成して適用できるようにする一連の乱数関数が用意されています。この記事ではC言語の乱数関数の使い方と注意点を詳しく紹介します。
C では、乱数関数には主に、擬似乱数生成関数と補助乱数関数の 2 つの側面が含まれます。
まず、C の疑似乱数生成関数を紹介します。 C 11 で導入された乱数ライブラリ <random></random>
は、より柔軟で効率的な擬似乱数生成関数を提供します。これには主に次の重要なクラスが含まれています:
std::random_device
: このクラスは実際の乱数シードを生成するために使用され、ハードウェア乱数ジェネレータまたはハードウェア乱数ジェネレータによって操作できます。システムが提供する乱数インターフェースを取得できます。 std::seed_seq
: このクラスは、乱数シード シーケンスを生成するために使用されます。複数のシード値を組み合わせてシード シーケンスを生成し、より複雑な乱数を提供できます。生成方法。 std::mt19937
、std::mt19937_64
: これら 2 つのクラスは、メルセンヌ回転アルゴリズムを使用して高品質の疑似乱数を生成する疑似乱数エンジンです。乱数、シーケンス。 std::mt19937
ステータスとして 32 ビット整数を使用します。std::mt19937_64
ステータスとして 64 ビット整数を使用します。 std::uniform_int_distribution
、std::uniform_real_distribution
: これら 2 つのクラスは、一様に分散された乱数ディストリビュータです。 std::uniform_int_distribution
は一様分布整数乱数の生成に使用され、std::uniform_real_distribution
は一様分布実数乱数の生成に使用されます。 これらのクラスを使用して、擬似乱数を生成します。まず、std::random_device
を使用して真の乱数シードを生成する必要があります。次に、擬似乱数エンジン std::mt19937
または std::mt19937_64
を介してシード初期化を使用し、ディストリビューター std::uniform_int_distribution
を使用します。または std::uniform_real_distribution
乱数を生成します。
以下は、一様に分布した整数乱数を生成する方法を示すサンプル コードです:
#include <iostream> #include <random> int main() { std::random_device rd; std::mt19937 gen(rd()); std::uniform_int_distribution<> dis(1, 100); for (int i = 0; i < 10; ++i) { std::cout << dis(gen) << " "; } return 0; }
上記のコードを実行すると、1 ~ 100 の範囲の 10 個のランダムな整数が出力されます。
疑似乱数生成関数に加えて、C では乱数をより便利に処理するための補助乱数関数もいくつか提供されています。
std::rand
: この関数は、0 から RAND_MAX
までの擬似乱数整数を生成します。デフォルトは RAND_MAX# です。 ##値は 32767 です。
rand 関数は通常、
std::srand を使用して乱数シードを設定しますが、比較的低品質の乱数しか生成できないことに注意してください。
: この関数は、擬似乱数生成器のシード値を設定するために使用されます。一般に、システム時刻をシード値として使用すると、プログラムによって生成される乱数シーケンスが実行のたびに異なることを確認できます。
: この関数はシーケンスをランダムにシャッフルするために使用されます。 2 つのイテレータ パラメータを受け取り、現在の擬似乱数ジェネレータに従ってシーケンスを再配置します。
rand や
srand など) の形式で存在し、より単純で直接的なものになります。使用。ただし、これらの関数によって生成される乱数は品質が低いため、実際の開発での使用はお勧めできません。対照的に、C++11 が提供する乱数ライブラリを使用すると、より柔軟で効率的になります。
以上がC++の乱数関数の詳しい解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。