Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中生成的相同随机数+;_C++_C_Random - Fatal编程技术网

C++ 在C+中生成的相同随机数+;

C++ 在C+中生成的相同随机数+;,c++,c,random,C++,C,Random,我已经用头撞了半个小时了,不知道出了什么问题。 我试图生成一个10个随机数的列表,1-100。但当我运行它时,它们都是相同的数字。这是非常令人沮丧的!我认为这是因为数字仍然存储在RAM中,但是在对随机数和变量重新随机三次之后,它仍然会得到相同的数字。我做错了什么 代码: main(){ int i; int-randnum; srand(时间(空)); randnum=rand()%2; 对于(i=0;i

我已经用头撞了半个小时了,不知道出了什么问题。 我试图生成一个10个随机数的列表,1-100。但当我运行它时,它们都是相同的数字。这是非常令人沮丧的!我认为这是因为数字仍然存储在RAM中,但是在对随机数和变量重新随机三次之后,它仍然会得到相同的数字。我做错了什么

代码:

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;
}