【C++11】ランダム値取得——random
4152 ワード
Cにおける乱数関数は1つの
C++11で提供される
次に、
乱数エンジンクラスは独立して動作可能な乱数発生器であり、あるタイプの乱数を均一な確率で生成するが、乱数の範囲、確率などの情報を指定することはできない.したがって、「元の乱数発生器」とも呼ばれ、乱数を生成する範囲を指定できないため、通常は単独で使用されません.
乱数分布クラスは、乱数エンジンクラスのサポートが必要なクラスですが、ある区間、ある分布確率の乱数など、ユーザーのニーズに応じて乱数エンジンを利用して条件に合った乱数を生成することができます.
すべての乱数エンジンクラスでサポートされているアクションは次のとおりです.
名前
機能
Engine e
エンジンを作成します.
Engine e(s)
エンジンを作成し、sをシードとして使用します.
e.seed(s)
シードsを使用してeの状態をチャージします.
e.min( ), e.max( )
e生成できる最小値と最大値.
e.discard(u)
eをuステップ(uのタイプはunsigned long long)に進みます.
次の表の乱数分布クラスに共通するアクションを示します.
名前
機能
U u
分布クラスuを作成します.
u(e)
乱数エンジンeで乱数を生成する(uは乱数分布クラスを表す).
u.min( )
u生成できる最小値.
u.max( )
u生成できる最大値.
u.reset( )
uの状態をリセットし、その後uが生成した値が前の値の影響を受けないようにします.
ランダム非負数-default_random_engine
したがって、10個のランダム非負数を生成して出力するには、次のように書くことができます.
デルのシステムでは、テスト結果は次のとおりです.
やはり「ランダム」なのがわかります.
もちろん、
プログラムを実行するたびに生成結果を異なるものにするには、現在のシステムの時間など、ランダムなシードを設定します.
特定の範囲の非負の数-uniform_int_distribution
したがって、0から9を生成する乱数プログラムは、次のように書くことができます.
私たちのシステムでは、その生成結果は次のとおりです.
ランダム浮動小数点数-uniform_real_distribution
次に、0~1のランダム浮動小数点数を10個生成する例を示す.
私たちのシステムの結果は次のとおりです.
ランダムブール値-bernoulli_distribution
次に、10個のランダムブール値を生成する例を示します.
私たちのシステムの結果は次のとおりです.
まとめ
一般的な乱数のクラスは次のとおりです.
実際,
rand( )
しかなく,ある区間範囲内の乱数,ひいてはランダムな浮動小数点数を生成するのは面倒であることが分かった.C++11で提供される
random
ライブラリは、必要なランダム値を容易に生成できるという問題を解決しました.次に、
random
ライブラリのコンポーネントを使用して、条件を満たす乱数を生成する方法について説明します.random
ライブラリのコンポーネントは、乱数エンジンクラスと乱数分布クラスの2つに分類されます.乱数エンジンクラスは独立して動作可能な乱数発生器であり、あるタイプの乱数を均一な確率で生成するが、乱数の範囲、確率などの情報を指定することはできない.したがって、「元の乱数発生器」とも呼ばれ、乱数を生成する範囲を指定できないため、通常は単独で使用されません.
乱数分布クラスは、乱数エンジンクラスのサポートが必要なクラスですが、ある区間、ある分布確率の乱数など、ユーザーのニーズに応じて乱数エンジンを利用して条件に合った乱数を生成することができます.
すべての乱数エンジンクラスでサポートされているアクションは次のとおりです.
名前
機能
Engine e
エンジンを作成します.
Engine e(s)
エンジンを作成し、sをシードとして使用します.
e.seed(s)
シードsを使用してeの状態をチャージします.
e.min( ), e.max( )
e生成できる最小値と最大値.
e.discard(u)
eをuステップ(uのタイプはunsigned long long)に進みます.
次の表の乱数分布クラスに共通するアクションを示します.
名前
機能
U u
分布クラスuを作成します.
u(e)
乱数エンジンeで乱数を生成する(uは乱数分布クラスを表す).
u.min( )
u生成できる最小値.
u.max( )
u生成できる最大値.
u.reset( )
uの状態をリセットし、その後uが生成した値が前の値の影響を受けないようにします.
ランダム非負数-default_random_engine
default_random_engine
は乱数エンジンクラスです.定義された呼び出し演算子は、ランダムなunsigned
タイプの値を返します.したがって、10個のランダム非負数を生成して出力するには、次のように書くことができます.
#include
#include
using namespace std;
int main( ){
default_random_engine e;
for(int i=0; i<10; ++i)
cout<
デルのシステムでは、テスト結果は次のとおりです.
16807
282475249
1622650073
984943658
1144108930
470211272
101027544
1457850878
1458777923
2007237709
やはり「ランダム」なのがわかります.
もちろん、
default_random_engine
も擬似乱数発生器にすぎず、プログラムを1回実行すると、結果はこれらの数になります.プログラムを実行するたびに生成結果を異なるものにするには、現在のシステムの時間など、ランダムなシードを設定します.
特定の範囲の非負の数-uniform_int_distribution
uniform_int_distribution
は乱数分布クラスであり、テンプレートクラスでもあり、テンプレートパラメータは乱数を生成するタイプ(ただしint、unsigned、short、unsigned short、long、unsigned long、long long、unsigned long、unsigned long longのいずれか)である.その構造関数は2つの値を受け入れ、乱数の分布範囲(閉区間)を表す.したがって、0から9を生成する乱数プログラムは、次のように書くことができます.
#include
#include
using namespace std;
int main( ){
default_random_engine e;
uniform_int_distribution u(0, 9);
for(int i=0; i<10; ++i)
cout<
私たちのシステムでは、その生成結果は次のとおりです.
0
1
7
4
5
2
0
6
6
9
ランダム浮動小数点数-uniform_real_distribution
uniform_real_distribution
は乱数分布クラスであり、テンプレートクラスでもあり、パラメータは乱数タイプ(オプションタイプはfloat、double、long double)を表します.コンストラクション関数にもパラメータとして最大値と最小値が必要です.次に、0~1のランダム浮動小数点数を10個生成する例を示す.
#include
#include
using namespace std;
int main( ){
default_random_engine e;
uniform_real_distribution u(0.0, 1.0);
for(int i=0; i<10; ++i)
cout<
私たちのシステムの結果は次のとおりです.
0.131538
0.45865
0.218959
0.678865
0.934693
0.519416
0.0345721
0.5297
0.00769819
0.0668422
ランダムブール値-bernoulli_distribution
bernoulli_distribution
は分散クラスですが、テンプレートクラスではありません.その構造関数には1つのパラメータしかありません.クラスがtrueを返す確率を表します.このパラメータはデフォルトで0.5です.すなわち、trueとfalseを返す確率は等しいです.次に、10個のランダムブール値を生成する例を示します.
#include
#include
using namespace std;
int main( ){
default_random_engine e;
bernoulli_distribution u;
for(int i=0; i<10; ++i)
cout<
私たちのシステムの結果は次のとおりです.
1
1
1
0
0
0
1
0
1
1
まとめ
一般的な乱数のクラスは次のとおりです.
default_random_engine
:ランダム非負数(単独使用は推奨されません).uniform_int_distribution
:指定範囲のランダム非負数.uniform_real_distribution
:指定範囲のランダム実数.bernoulli_distribution
:確率のランダムブール値を指定します.実際,
random
ライブラリの機能は極めて豊富で,そのうち乱数エンジンはdefault_random_engine
個にとどまらず,分布クラスも上記3個にとどまらない.ポアソン分布、正規分布、サンプリング分などの高度な乱数機能も行うことができますが、これらの内容を詳しく知りたい場合は他の資料を参照してください.これらの内容を補うには長い間待たなければならないかもしれません.