web-dev-qa-db-ja.com

C ++で乱数を生成する最良の方法は何ですか?

乱数を生成する最良の方法は何ですか?

16
hamed

次の場合のみ:

  • 「完全な均一性」を求めていない、または

  • c ++ 11はサポートされておらず、TR1もサポートされていません(したがって、別の選択肢はありません)

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>Kerrek SB がすでに指摘したように。

13
LihO

<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のいずれかで、基本的に同じインターフェイスで見つけることができました(わずかな違いはありますが)。

25
Kerrek SB

Boost.Random は、疑似乱数(または、プラットフォームがサポートしている場合は真にランダム)を生成するための優れたライブラリです。

5
spencercw

C++ 11より前の標準C++ライブラリについて話している場合、Randとsrandが乱数ジェネレータです。整数演算でモジュラスを使用するよりも、これらの関数からより高い精度を得る方法があります。たとえば、高速が問題にならない場合はdoubleを使用し、結果をintに丸めることができます。

カスタムライブラリに関しては、本当に良いランダムな配布と速度が必要な場合は、グーグルメルセンヌツイスター。ブーストにはオプションもあります。

C++ 11では、<random>http://en.cppreference.com/w/cpp/numeric/random

2
stinky472

私の「ランダム」ライブラリは、C++ 11ランダムクラスの非常に便利なラッパーを提供します。単純な「get」メソッドでほとんどすべてのことを実行できます。

例:

  1. 範囲内の乱数

auto val = Random::get(-10, 10); // Integer
auto val = Random::get(10.f, -10.f); // Float point

  1. ランダムブール値

auto val = Random::get<bool>( ) // 0.5% to generate true

auto val = Random::get<bool>( 0.7 ) // 0.7% to generate true

  1. Std :: initilizer_listからのランダムな値
_auto val = Random::get( { 1, 3, 5, 7, 9 } ); // val = 1 or 3 or...
_
  1. イテレータ範囲またはすべてのコンテナからのランダムイテレータ

auto it = Random::get( vec.begin(), vec.end() ); // it = random iterator

auto it = Random::get( vec ); // return random iterator

そしてさらに多くのもの! githubページをチェックしてください:

https://github.com/effolkronium/random

1
Ilya Polishchuk