乱数を生成する最良の方法は何ですか?
then次のCスタイルのソリューションの使用を検討するかもしれません(このコミュニティの評判のために〜 Rand()を参照)有害と見なされる )は取り消し線フォントで書かれています:
これは、min
からmax
までの間隔から乱数を生成する単純なCスタイルの関数です。これらの数値は、一様分布に非常に近いようです。
int irand(int min, int max) { return ((double)Rand() / ((double)Rand_MAX + 1.0)) * (max - min + 1) + min; }
使用する前にsrand
を呼び出すことを忘れないでください。
int occurences[8] = {0}; srand(time(0)); for (int i = 0; i < 100000; ++i) ++occurences[irand(1,7)]; for (int i = 1; i <= 7; ++i) printf("%d ", occurences[i]);
出力:14253 14481 14210 14029 14289 14503 14235
また、見てください:
範囲内で乱数を生成しますか?
範囲全体で一様に乱数を生成する
時間を見つけて、前述の最初の11分以上を見てください ビデオ
<random>
を使用する必要があります:
#include <random>
typedef std::mt19937 rng_type;
std::uniform_int_distribution<rng_type::result_type> udist(0, 7);
rng_type rng;
int main()
{
// seed rng first:
rng_type::result_type const seedval = get_seed(); // get this from somewhere
rng.seed(seedval);
rng_type::result_type random_number = udist(rng);
return random_number;
}
C++ 11より前では、これはTR1(<tr1/random>
、std::tr1::mt19937
など)またはBoost.randomのいずれかで、基本的に同じインターフェイスで見つけることができました(わずかな違いはありますが)。
Boost.Random は、疑似乱数(または、プラットフォームがサポートしている場合は真にランダム)を生成するための優れたライブラリです。
C++ 11より前の標準C++ライブラリについて話している場合、Randとsrandが乱数ジェネレータです。整数演算でモジュラスを使用するよりも、これらの関数からより高い精度を得る方法があります。たとえば、高速が問題にならない場合はdoubleを使用し、結果をintに丸めることができます。
カスタムライブラリに関しては、本当に良いランダムな配布と速度が必要な場合は、グーグルメルセンヌツイスター。ブーストにはオプションもあります。
C++ 11では、<random>
。 http://en.cppreference.com/w/cpp/numeric/random
私の「ランダム」ライブラリは、C++ 11ランダムクラスの非常に便利なラッパーを提供します。単純な「get」メソッドでほとんどすべてのことを実行できます。
例:
auto val = Random::get(-10, 10); // Integer
auto val = Random::get(10.f, -10.f); // Float point
auto val = Random::get<bool>( ) // 0.5% to generate true
auto val = Random::get<bool>( 0.7 ) // 0.7% to generate true
_auto val = Random::get( { 1, 3, 5, 7, 9 } ); // val = 1 or 3 or...
_
auto it = Random::get( vec.begin(), vec.end() ); // it = random iterator
auto it = Random::get( vec ); // return random iterator
そしてさらに多くのもの! githubページをチェックしてください: