サーチ…


備考

C ++での乱数生成は、 <random>ヘッダによって行われます。このヘッダーは、ランダムデバイス、擬似乱数発生器、および分布を定義します。

ランダムなデバイスは、オペレーティングシステムによって提供される乱数を返します。擬似乱数生成器の初期化に使用するか、または暗号化目的で直接使用する必要があります。

擬似ランダムジェネレータは、初期シードに基づいて整数擬似乱数を返します。擬似乱数の範囲は、通常、符号なしタイプのすべての値にわたっています。標準ライブラリのすべての擬似乱数ジェネレータは、すべてのプラットフォームの同じ初期シードに対して同じ番号を返します。

分布は、擬似ランダムジェネレータまたはランダムデバイスから乱数を消費し、必要な分布を持つ乱数を生成します。ディストリビューションはプラットフォームに依存せず、異なるプラットフォーム上で同じ初期シードを持つ同じジェネレータに対して異なる数を生成することができます。

真の乱数生成器

暗号化に使用できる真のランダム値を生成するには、 std::random_deviceをジェネレータとして使用する必要があります。

#include <iostream>
#include <random>

int main()
{
   std::random_device crypto_random_generator;
   std::uniform_int_distribution<int> int_distribution(0,9);
   
   int actual_distribution[10] = {0,0,0,0,0,0,0,0,0,0};
   
   for(int i = 0; i < 10000; i++) {
       int result = int_distribution(crypto_random_generator);
       actual_distribution[result]++;
   }

   for(int i = 0; i < 10; i++) {
       std::cout << actual_distribution[i] << " ";
   }
   
   return 0;
}

std::random_deviceは、擬似ランダム値ジェネレータと同じ方法で使用されます。

しかし、非決定論的なソース(例えば、ハードウェアデバイス)が実装に利用可能でない場合、実装定義の擬似乱数エンジンに関して std::random_device を実装することができます。

このような実装を検出するには、 entropyメンバ関数 (ジェネレータが完全に決定論的であるときにゼロを返す)が必要ですが、多くの一般的なライブラリ(GCCのlibstdc ++とLLVMのlibc ++の両方)は、高品質の外部ランダム性。

擬似乱数の生成

疑似乱数ジェネレータは、以前に生成された値に基づいて推測できる値を生成します。つまり、決定的です。真の乱数が必要な状況では、擬似乱数ジェネレータを使用しないでください。

#include <iostream>
#include <random>

int main()
{
   std::default_random_engine pseudo_random_generator;
   std::uniform_int_distribution<int> int_distribution(0, 9);
   
   int actual_distribution[10] = {0,0,0,0,0,0,0,0,0,0};
   
   for(int i = 0; i < 10000; i++) {
       int result = int_distribution(pseudo_random_generator);
       actual_distribution[result]++;
   }

   for(int i = 0; i <= 9; i++) {
       std::cout << actual_distribution[i] << " ";
   }
   
   return 0;
}

このコードは、乱数ジェネレータと、尤度が等しい[0,9]の範囲の整数を生成する分布を作成します。次に、各結果が何回生成されたかを数えます。

std::uniform_int_distribution<T>のテンプレートパラメータは、生成されるべき整数の型を指定する。 floatまたはdoubleを生成するには、 std::uniform_real_distribution<T>を使用します。

複数のディストリビューションにジェネレータを使用する

乱数ジェネレータは、複数のディストリビューションに使用できます(また、使用する必要があります)。

#include <iostream>
#include <random>

int main()
{
   std::default_random_engine pseudo_random_generator;
   std::uniform_int_distribution<int> int_distribution(0, 9);
   std::uniform_real_distribution<float> float_distribution(0.0, 1.0);
   std::discrete_distribution<int> rigged_dice({1,1,1,1,1,100});
   
   std::cout << int_distribution(pseudo_random_generator) << std::endl;
   std::cout << float_distribution(pseudo_random_generator) << std::endl;
   std::cout << (rigged_dice(pseudo_random_generator) + 1) << std::endl;
   
   return 0;
}

この例では、ジェネレータは1つだけ定義されています。その後、3つの異なる分布でランダム値を生成するために使用されます。 rigged_dice分布は、0と5の間の値を生成するが、ほとんど常に発生します5生成する機会ので、 5ある100 / 105



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow