私は、上記のすべてのものを赤のようなことではC ++で40件の他のページについて、このと見ステファン・T. Lavavejからビデオを「STL」
とまだ私は把握して完全な日曜日かかったので実践で確認してくださいどのように乱数の作品ではなかったですそのすべてについて、それがどのように機能し、使用できるか。
私の意見では、STLは「もうsrandを使わない」ことについて正しいと彼はビデオでそれをうまく説明しました2。彼はまた使用することをお勧めします:
a)void random_device_uniform()
-暗号化された生成が遅い(私の例から)
b)以下の例mt19937
-高速で、暗号化されていないシードを作成する機能
私がアクセスできるすべての主張されたc ++ 11の本を取り出したところ、Breymann(2015)のようなドイツの作者がまだクローンを使用していることがわかりました
srand( time( 0 ) );
srand( static_cast<unsigned int>(time(nullptr))); or
srand( static_cast<unsigned int>(time(NULL))); or
ちょうどで<random>
はなく、<time> and <cstdlib>
#includings -そう:)だけで一冊の本から学ぶように注意してください。
意味-c ++ 11以降は使用しないでください:
多くの場合、プログラムは乱数のソースを必要とします。新しい標準の前は、CとC ++の両方がrandという名前の単純なCライブラリ関数に依存していました。その関数は、0からシステムに依存する最大値(少なくとも32767)の範囲で均一に分布する疑似乱数整数を生成します。rand関数には、いくつかの問題があります。 randがプロデュースしたもの。一部のアプリケーションでは、ランダムな浮動小数点数が必要です。一部のプログラムでは、不均一な分布を反映する数値が必要です。プログラマは、randによって生成される数値の範囲、型、または分布を変換しようとするときに、非ランダム性を導入することがよくあります。(Lippmans C ++プライマー第5版2012からの引用)
私はついに、Bjarne Stroustrupsの新しい20冊の本から最良の説明を見つけました-彼は彼のことを知っているはずです-「C ++ 2019のツアー」、「C ++ 2016を使用したプログラミングの原則と実践」、および「C ++プログラミング言語第4版」 2014年」と「リップマンズC ++プライマー第5版2012」の例:
乱数ジェネレーターは2つの部分で構成されているため、非常に単純です。
(1)ランダムまたは疑似ランダム値のシーケンスを生成するエンジン。(2)これらの値を範囲内の数学的分布にマップする分布。
MicrosoftのSTLの人の意見にもかかわらず、Bjarne Stroustrupsは次のように書いています。
では、標準ライブラリが乱数エンジンと分布を提供しています(§24.7)。デフォルトではdefault_random_engineを使用します。これは、幅広い適用性と低コストのために選択されています。
このvoid die_roll()
例は、Bjarne Stroustrupsによるものです。優れたアイデア生成エンジンとディストリビューションusing
(詳細はこちら)。
ここで、標準ライブラリによって提供される乱数ジェネレータを実際に使用できるようにするには、<random>
さまざまな例を含む実行可能コードを必要最小限に減らし、時間とお金を安全にしてください。
#include <random> //random engine, random distribution
#include <iostream> //cout
#include <functional> //to use bind
using namespace std;
void space() //for visibility reasons if you execute the stuff
{
cout << "\n" << endl;
for (int i = 0; i < 20; ++i)
cout << "###";
cout << "\n" << endl;
}
void uniform_default()
{
// uniformly distributed from 0 to 6 inclusive
uniform_int_distribution<size_t> u (0, 6);
default_random_engine e; // generates unsigned random integers
for (size_t i = 0; i < 10; ++i)
// u uses e as a source of numbers
// each call returns a uniformly distributed value in the specified range
cout << u(e) << " ";
}
void random_device_uniform()
{
space();
cout << "random device & uniform_int_distribution" << endl;
random_device engn;
uniform_int_distribution<size_t> dist(1, 6);
for (int i=0; i<10; ++i)
cout << dist(engn) << ' ';
}
void die_roll()
{
space();
cout << "default_random_engine and Uniform_int_distribution" << endl;
using my_engine = default_random_engine;
using my_distribution = uniform_int_distribution<size_t>;
my_engine rd {};
my_distribution one_to_six {1, 6};
auto die = bind(one_to_six,rd); // the default engine for (int i = 0; i<10; ++i)
for (int i = 0; i <10; ++i)
cout << die() << ' ';
}
void uniform_default_int()
{
space();
cout << "uniform default int" << endl;
default_random_engine engn;
uniform_int_distribution<size_t> dist(1, 6);
for (int i = 0; i<10; ++i)
cout << dist(engn) << ' ';
}
void mersenne_twister_engine_seed()
{
space();
cout << "mersenne twister engine with seed 1234" << endl;
//mt19937 dist (1234); //for 32 bit systems
mt19937_64 dist (1234); //for 64 bit systems
for (int i = 0; i<10; ++i)
cout << dist() << ' ';
}
void random_seed_mt19937_2()
{
space();
cout << "mersenne twister split up in two with seed 1234" << endl;
mt19937 dist(1234);
mt19937 engn(dist);
for (int i = 0; i < 10; ++i)
cout << dist() << ' ';
cout << endl;
for (int j = 0; j < 10; ++j)
cout << engn() << ' ';
}
int main()
{
uniform_default();
random_device_uniform();
die_roll();
random_device_uniform();
mersenne_twister_engine_seed();
random_seed_mt19937_2();
return 0;
}
私はそれをすべて追加すると思います、そして私が言ったように、それをその例に蒸留するために私にたくさんの読書と時間を要しました-あなたが番号生成についてさらに何かがあるなら、私は午後またはコメントセクションでそれについて聞いてうれしいです必要に応じて追加するか、この投稿を編集します。ブール