如前所述,您可以通过使用相同的种子多次对 srand 进行播种。
srand(1234)
// ....
srand(1234)
rand()
的输出将从之前的同一点重新开始。
顺便说一下,我建议不要在 rand()
上使用模运算符,因为它不会产生均匀分布的值。相反,您可以使用以下辅助程序在整数范围内获取随机值:
int randRange(int M, int N)
{
return M + rand() / ( RAND_MAX / ( N - M ) + 1 );
}
int nextrand = randRange(100,200);
请参阅Julienne Walker的Eternally Confuzzled文章以获取更多背景信息,也可以了解种子。
C++选项
上述方法的缺点是生成完全是顺序的(您不能同时拥有两个随机生成器实例)。既然您使用的是C++,为什么不使用它呢!
您可以使用tr1或c++0x/c++111uniform_int_distribution
:
#include <random>
#include <functional>
std::uniform_int_distribution<int> distribution(100, 200);
std::mt19937 engine;
int nextrand = distribution(engine);
一个即时的优势是,您可以同时拥有多个引擎生成相同的序列(请参见示例)。
正如您所看到的,您也可以像使用srand
一样对生成器进行种子设置,例如:engine(1234)
。
在以下网址上查看示例实时效果:
1 如果你使用C++03,可以使用Boost.Random库。