C++ 在C+中生成的相同随机数+;
我已经用头撞了半个小时了,不知道出了什么问题。 我试图生成一个10个随机数的列表,1-100。但当我运行它时,它们都是相同的数字。这是非常令人沮丧的!我认为这是因为数字仍然存储在RAM中,但是在对随机数和变量重新随机三次之后,它仍然会得到相同的数字。我做错了什么 代码:C++ 在C+中生成的相同随机数+;,c++,c,random,C++,C,Random,我已经用头撞了半个小时了,不知道出了什么问题。 我试图生成一个10个随机数的列表,1-100。但当我运行它时,它们都是相同的数字。这是非常令人沮丧的!我认为这是因为数字仍然存储在RAM中,但是在对随机数和变量重新随机三次之后,它仍然会得到相同的数字。我做错了什么 代码: main(){ int i; int-randnum; srand(时间(空)); randnum=rand()%2; 对于(i=0;i
main(){
int i;
int-randnum;
srand(时间(空));
randnum=rand()%2;
对于(i=0;i<10;i++){
srand(时间(空));
randnum=rand()%100+1;
srand(时间(空));
兰德();
列表[i]=randnum;
srand(时间(空));
randnum=rand()%100+1;
srand(时间(空));
兰德();
}
srand(时间(空));
randnum=rand()%100+1;
}
不要使用srand(时间(NULL))
重新初始化生成器。只在代码开头使用一次。不要多次调用srand()
。这段代码的执行时间可能不到一秒钟,因此每次调用srand(time(NULL))
当在实现中以秒为单位测量时间时,只需将伪随机数生成器重置为相同的种子,所以你所有的数字都是一样的。你做错了的是你正在重置随机数生成器的状态
不明显的原因是你在利用时间。time返回time,根据标准,time是“实现与当前日历时间的最佳近似值”。这通常表示自UTC 1970年1月1日00:00小时起的秒数。现在,您的代码可能会在一毫秒内执行,因此所有时间调用都返回相同的值
因此,您的代码相当于:
int const somenum = time(NULL);
srand(somenum); //reset state using some seed.
//rand() will always produce the same value after an
// srand call of the same seed.
randnum = rand() % 100 + 1;
srand(somenum); //reset state using some seed.
randnum = rand() % 100 + 1;
srand(somenum); //reset state using some seed.
randnum = rand() % 100 + 1;
srand(somenum); //reset state using some seed.
randnum = rand() % 100 + 1;
要测试这一点,请在每次调用rand之间等待按键,您将看到它们是不同的
解决这个问题的方法是在开始时只调用srand(time(NULL))一次
现在,在C++11中,还有另一种方法:
#include <iostream>
#include <random>
int main()
{
const int rand_max = 20;
std::default_random_engine rng(std::random_device{}());
std::uniform_int_distribution<> dist(0, rand_max);
std::cout<<"This will always be as random a number as your hardware can give you: "<<dist(rng)<<std::endl;
return 0;
}
#包括
#包括
int main()
{
const int rand_max=20;
std::default_random_引擎rng(std::random_设备{}());
标准:均匀分布区(0,最大值);
std::coutAlso,如果你真的想使用rand,不要每次都调用srand,它会重置序列,这意味着你总是会得到第一个数字。@chris:rand()
不是问题,在循环中调用srand()
,种子的分辨率为seconds
是问题。rand()
取而代之很好。你并不总是需要高质量的PRNG。将其称为“有害”是一种误导性的夸张。@chris:Microsoft CRT中的rand
实现有点丢脸,rand\u MAX只有32767。挑剔,但尽管POSIX系统将时间定义为“UTC 1970年1月1日00:00小时后的秒数”这在人们实际使用的大多数桌面系统上都是如此,C既不要求从该日期开始测量时间,也不要求以秒为单位测量时间。
#include <iostream>
#include <random>
int main()
{
const int rand_max = 20;
std::default_random_engine rng(std::random_device{}());
std::uniform_int_distribution<> dist(0, rand_max);
std::cout<<"This will always be as random a number as your hardware can give you: "<<dist(rng)<<std::endl;
return 0;
}