srand()
toの呼び出しとtoの呼び出しを組み合わせた関数を作成する必要は実際にはありませんrand()
。
srand()
一連の乱数をシード(つまり初期化)するために使用されます。その後の繰り返しの呼び出しrand()
は、実際に乱数を生成するために使用されます。(rand()
乱数ジェネレーターの内部状態を更新するため、次回呼び出されたときに(通常)同じ番号が再度生成されることはありません。)
を呼び出すsrand()
前に毎回呼び出すrand()
と、シーケンスは毎回再初期化されます。渡されたシードが毎回同じである場合、関数は毎回同じ乱数を返します。
したがって、とにかく2つの呼び出しを分離する必要があります。
<random>
また、C++11のヘッダーによって提供される乱数生成フレームワークにも興味があるかもしれません。サンプルコードは次のとおりです(主にcppreferenceからコピーされます)。
#include <random>
#include <iostream>
int main()
{
/* Initialise and seed. Do this only once. */
std::random_device rd;
std::mt19937 gen(rd());
/* Define how to use the raw random numbers, i.e.
a probability distribution. In this case a
uniform distribution with six possible integer
events. */
std::uniform_int_distribution<> dis(1, 6);
/* Generate a series of random events. No reseeding. */
for(int n=0; n<10; ++n)
std::cout << dis(gen) << ' ';
std::cout << std::endl;
}
cppreferenceには、<random>
ヘッダーとそれが提供する多くのオプションのかなり良い説明があります:http: //en.cppreference.com/w/cpp/numeric/random。
これのほとんどは、さらに多くのオプションを提供するBoostランダムライブラリに触発されています:http : //www.boost.org/doc/libs/1_52_0/doc/html/boost_random.html(1.52.0バージョンへのリンク)。したがって、C ++ 11を使用できない場合、または標準で提供されていない関数が必要な場合は、Boostライブラリを使用することをお勧めします。