2011-04-16 74 views
0
srand(time(NULL)); 
for (it=hand.begin(); it < hand.end(); it++) 
    (*it) = rand() % 13 + 1; 

此代码无法一次创建许多随机数。 有没有一种方法可以做到不像Mersennes那么复杂,并且不依赖于操作系统?如何在c/C++中创建伪随机数?

+0

我觉得这句话*“这个代码不工作创造大量的随机数一次“* ....不够清楚! – Nawaz 2011-04-16 17:19:33

+1

重复多次。你只种子(即叫'srand')***一次***。然后你只需一遍又一遍地调用'rand'。基本上所有的PRNG都是这样工作的。 – dmckee 2011-04-16 17:19:58

+1

xkcd在哪里? ... [啊! :)](http://xkcd.com/221/) – pmg 2011-04-16 17:20:50

回答

4

PRNGs不会一次创建多个PRN。每个输出都依赖于以前的输出,PRNG是高度有状态的。

尝试:

srand(time(NULL)); // once at the start of the program 

for(int i = 0; i < N; ++i) 
    r[i] = rand(); 

即使API的是,在一个函数调用返回输出的整个街区,刚刚搬进函数内部的循环。

1

Boost.Random有很多很好的随机数发生器,易于使用。

2

只需在您的程序开始时拨打srand一次。然后拨打rand()而不是srand(rand()))生成每个随机数。

0

George Marsaglia前段时间在sci.math发布了Multiply With Carry PRNG

我不能说它有多好或它的表现如何,但你可能想试一试。

它应该是OS和平台无关的。

0

“请确认您回答这个问题” OK

for (int i=n1; i < n2; ++i) 
    { 
    int k; 
    do k = rand(); while (i !=k); 
    // k is a sequential pseudo random number 
    } 

可能存在与效率问题...