C++ で 0 と 1 の間の乱数を生成する方法

胡金庫 2023年10月12日
  1. C++11 <random> ライブラリを使用して 0 から 1 の間の乱数を生成する
  2. C++ で 0 と 1 の間のランダムなフロートを生成するには、関数 std::rand を利用する
C++ で 0 と 1 の間の乱数を生成する方法

この記事では、0 から 1 の間隔で乱数の浮動小数点数を生成する方法について、いくつかの C++ の方法を説明します。

C++11 <random> ライブラリを使用して 0 から 1 の間の乱数を生成する

C++11 バージョンでは、乱数および疑似乱数生成のためのクラス/メソッドが提供されています。これらの標準ライブラリ機能は、最新の C++ コードベースで乱数生成を扱うために推奨されています。

std::random_device オブジェクトが最初に初期化されます。これは、次の行で初期化される乱数エンジン std::default_random_engine をシードするために使用される非決定論的一様ランダムビットジェネレーターです。このようにして、エンジンが同じ番号シーケンスを生成しないことが保証されます。

C++ の <random> ライブラリに実装されている乱数エンジンはいくつかありますが、時間や空間の要件などいくつかの要素で異なります(完全なリストはこちらを参照してください)。以下の例では、std::default_random_engine を用いてランダムな浮動小数点演算を行っています。アプリケーションの制約で必要なアルゴリズムエンジンを指定することができます。次のステップでは、一様分布を初期化し、min/max 値を引数として渡します。最後に、[0-1]間隔で 5つのランダムな浮動小数点値をコンソールに出力します。

#include <iomanip>
#include <iostream>
#include <random>

using std::cout;
using std::endl;
using std::setprecision;

constexpr int FLOAT_MIN = 0;
constexpr int FLOAT_MAX = 1;

int main() {
  std::random_device rd;
  std::default_random_engine eng(rd());
  std::uniform_real_distribution<float> distr(FLOAT_MIN, FLOAT_MAX);

  for (int n = 0; n < 5; ++n) {
    cout << setprecision(6) << distr(eng) << "\n";
  }

  return EXIT_SUCCESS;
}

出力:

0.22808
0.343274
0.408204
0.687902
0.572947

テンプレートパラメータとして floatdoublelong double のいずれかを渡さなかった場合、std::uniform_real_distribution< T > は未定義のの動作をすることに注意してください。

C++ で 0 と 1 の間のランダムなフロートを生成するには、関数 std::rand を利用する

rand 関数は C 標準ライブラリの乱数生成機能の一部です。高品質の乱数性を必要とするアプリケーションには推奨されません。しかし、テスト目的や暗号に影響を受けない数値生成のために利用することはできます。

関数 rand は 0 から RAND_MAX (いずれも含む) の間の擬似乱数を生成します。RAND_MAX の値は実装に依存しており、保証される最小値は 32767 しかないので、生成される数値には制約があります。この関数は std::srand でシードされていなければならないことに注意してください(できれば std::time を用いて現在の時刻を渡すことが望ましいです)。最後に、[0-1]の間隔で浮動小数点値を生成します。

#include <iomanip>
#include <iostream>
#include <random>

using std::cout;
using std::endl;
using std::setprecision;

constexpr int FLOAT_MIN = 0;
constexpr int FLOAT_MAX = 1;

int main() {
  std::srand(std::time(nullptr));
  for (int i = 0; i < 5; i++)
    cout << setprecision(6)
         << FLOAT_MIN +
                (float)(rand()) / ((float)(RAND_MAX / (FLOAT_MAX - FLOAT_MIN)))
         << endl;

  return EXIT_SUCCESS;
}

出力:

0.483029
0.252537
0.264023
0.90233
0.573071
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Float