我正在尝试使用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)的分辨率为第二),这就是为什么所有后续对象都具有非常相似的属性。
答案 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()
调用