srand(time(NULL));
for (it=hand.begin(); it < hand.end(); it++)
(*it) = rand() % 13 + 1;
此代码不能一次创建许多随机数。 有没有办法做到不像Mersennes那么复杂并且不依赖于操作系统?
答案 0 :(得分:4)
PRNG不会立刻创建多个PRN。每个输出都取决于先前的输出,PRNG是高度有状态的。
尝试:
srand(time(NULL)); // once at the start of the program
for( int i = 0; i < N; ++i )
r[i] = rand();
即使在单个函数调用中返回整个输出块的API,也只是在函数内部移动了该循环。
答案 1 :(得分:2)
在程序开始时只调用srand
一次。然后拨打rand()
(不 srand(rand())
)以生成每个随机数。
答案 2 :(得分:1)
Boost.Random有很多好的随机数生成器,易于使用。
答案 3 :(得分:0)
George Marsaglia不久前在sci.math发布了Multiply With Carry PRNG。
我不能说它有多好或它的表现如何,但你可能想尝试一下。
它应该是独立于操作系统和平台的。
答案 4 :(得分:0)
“请确保你回答这个问题” 行
for (int i=n1; i < n2; ++i)
{
int k;
do k = rand(); while (i !=k);
// k is a sequential pseudo random number
}
可能存在效率问题......