使用rand()生成随机数

时间:2012-03-22 08:07:00

标签: c++ random

我正在尝试使用rand()%(范围)生成一堆随机数。 以下是我的代码设置方式:

srand(time(NULL));
someClass *obj = new someClass(rand()%range1,rand()%range2... etc ); // i.e. a number of random numbers one after the other

每当我运行它时,似乎所有对rand()的调用都会生成相同的数字。我试过没有:(编辑:所有rand()不会生成相同的数字,最后阅读编辑)

srand(time(NULL));

然后,程序的每次执行都会产生相同的结果。

另外,由于对rand()的所有调用都在构造函数中,所以我不能一直重新调用它。我想我可以预先创建发送给构造函数的所有对象,然后在中间重新设置随机数生成器,但这似乎是一个不优雅的解决方案。

如何生成一堆不同的随机数?

编辑:似乎是因为我在循环中创建了很多对象,所以每次循环迭代srand(time(NULL))都被重新接种并且序列被重置(因为时间(NULL)的分辨率为第二),这就是为什么所有后续对象都具有非常相似的属性。

4 个答案:

答案 0 :(得分:7)

如果您拨打srand 一次,则所有后续rand次来电都将返回(不同的)伪随机数。如果他们不这样做,你做错了。 :)

除此之外,rand毫无用处。 Boost.Random(或C ++ 11标准库<random>标头)提供了更强大的随机数生成器,具有更好,更现代的接口(例如,允许您拥有多个独立的生成器,与{{1不同)它使用单个全局种子)

答案 1 :(得分:2)

除非重新开始使用不同的起点,rand()始终返回相同的序列。这实际上是使程序测试可重复的功能!

因此,如果您想要针对不同的运行使用不同的序列,那么来调用srand。也许你可以在调用第一个构造函数之前做到这一点?

答案 2 :(得分:2)

在程序开始时调用srand一次。然后在任何想要随机数的时候调用rand()%范围。这是一个适合您情况的示例,效果很好

#include <iostream>
#include <stdlib.h>
#include <time.h>

using namespace std;

class Test
{
    public:
    Test(int num0,int num1, int num2):num0_(num0),num1_(num1),num2_(num2){}
    int num0_,num1_,num2_;
};

int main()
{
    srand(time(NULL));
    Test *test=new Test(rand()%100,rand()%100,rand()%100);
    cout << test->num0_ << "\n";
    cout << test->num1_ << "\n";
    cout << test->num2_ << "\n";
    delete test;
    return 0;
}

答案 3 :(得分:1)

在以下位置查看此代码:http://ideone.com/xV0R3#view_edit_box

#include<iostream>
#include <stdio.h>
#include <stdlib.h>
#include<time.h>

using namespace std;
int main()
{
int i=0;
srand(time(NULL));
while(i<10)
{
cout<<rand()<<endl;
i++;
}
return 0;
}

这产生不同的随机数。您只需拨打srand()一次。每次srand()调用

后,rand()都会生成不同的数字