MENU

【C++】乱数の生成方法3選

この記事では、C++で乱数を生成する方法を3つ紹介します。

目次

rand関数

rand関数は、C言語から引き継がれている標準ライブラリの関数で、古典的な乱数生成方法です。

実装例

#include <iostream>
#include <cstdlib>  // rand(), srand()
#include <ctime>    // time()

int main() {
    std::srand(static_cast<unsigned int>(std::time(0)));  // シード値の設定

    // 0 から 99 の範囲で乱数を生成
    for (int i = 0; i < 5; ++i) {
        int random_number = std::rand() % 100;
        std::cout << "Random number: " << random_number << std::endl;
    }

    return 0;
}

説明

  • srand()で乱数のシード値を設定します。この例ではtime(0)を使って現在の時刻をシード値にしています。
  • rand()は0からRAND_MAX(32767)の範囲で整数を生成します。これを特定の範囲内に収めるために、モジュロ演算子(%)を使います。

注意点

  • rand()は擬似乱数生成器であり、制度があまり高くないです。
  • モジュロ演算子を使用することで、結果に偏りが生じる場合があります。

randomライブラリ

C++11で導入された乱数生成のためのライブラリで、より柔軟で品質の高い乱数生成が可能です。

実装例

#include <iostream>
#include <random>  // random_device, mt19937, uniform_int_distribution

int main() {
    std::random_device rd;   // 非決定論的な乱数生成器
    std::mt19937 gen(rd());  // メルセンヌ・ツイスタ法による擬似乱数生成器
    std::uniform_int_distribution<> dis(0, 99);  // 0 から 99 の範囲の一様分布

    // 乱数を生成
    for (int i = 0; i < 5; ++i) {
        int random_number = dis(gen);
        std::cout << "Random number: " << random_number << std::endl;
    }

    return 0;
}

説明

  • random_deviceは非決定論的な乱数(ハードウェア乱数)を生成しますが、一部の環境では擬似乱数になることもあります。
  • mt19937はメルセンヌ・ツイスタ法に基づく擬似乱数生成器で、高速かつ品質の高い乱数を生成します。
  • uniform_int_distributionを使って、指定した範囲内の整数を均等に分布するように乱数を生成します。

std::seed_seq

C++20では、新しい乱数生成機能が追加されましたが、基本的な使い方はC++11のものと変わりません。

実装例

#include <iostream>
#include <random>  // random_device, mt19937, uniform_int_distribution, seed_seq

int main() {
    std::random_device rd;
    std::seed_seq seed{rd(), rd(), rd(), rd(), rd()};  // 複数の乱数からシードを生成
    std::mt19937 gen(seed);
    std::uniform_int_distribution<> dis(0, 99);

    for (int i = 0; i < 5; ++i) {
        int random_number = dis(gen);
        std::cout << "Random number: " << random_number << std::endl;
    }

    return 0;
}

説明

  • std::seed_seqを使うことで、複数の乱数からより複雑なシードを生成できます。
  • 再現性を持たせたい場合や複数の乱数生成器を同じシードで初期化したい場合に適しています。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

20代の組み込みソフトウェアエンジニア
主な使用言語はC++

---------------------資格---------------------
応用情報技術者
ネットワークスペシャリスト

目次