C++ rand()生成相同的数字

C++ rand()生成相同的数字,c++,visual-c++,C++,Visual C++,可能重复: 为什么兰德生成相同的数字 死亡 die.cpp #include"die.h" #include<iostream> #include<time.h> using namespace std; void Die::roll() { srand(static_cast<int>(time(0))); number=1+rand()%6; } void Die::printValue() { cout<<num

可能重复:

为什么兰德生成相同的数字

死亡

die.cpp

#include"die.h"
#include<iostream>
#include<time.h>
using namespace std;

void Die::roll()
{
    srand(static_cast<int>(time(0)));
    number=1+rand()%6;
}

void Die::printValue()
{
    cout<<number<<endl;
}
main.cpp

#include"die.h"
#include<iostream>
using namespace std;

int main()
{
    Die d;
    d.roll();
    d.printValue();
    d.roll();
    d.printValue();
    d.roll();
    d.printValue();
}

您需要使用真正随机的或至少唯一的种子初始化随机生成器,并且只需执行一次

这通常在开始时使用srandtimeNULL完成


rand生成的数字不是随机的,而是*伪*随机的:给定相同的种子,它将始终返回相同的序列。默认情况下,我相信初始种子是零,但是,它肯定在程序运行之间总是相同的-因此,如果不进行种子设定,每次都会得到相同的明显随机序列。

您需要使用真正随机或至少唯一的种子初始化随机生成器,并且只执行一次

这通常在开始时使用srandtimeNULL完成

rand生成的数字不是随机的,而是*伪*随机的:给定相同的种子,它将始终返回相同的序列。默认情况下,我相信初始种子是零,但是,它肯定在程序运行之间总是相同的-因此,如果不进行种子设定,您每次都会得到相同的明显随机序列。

您对die.roll的调用非常接近,以至于time0每次都返回相同的值,因此,您的兰德种子在每次调用.roll时都是相同的

尝试调用srandstatic\u casttime0;只在.roll之外一次,就像在Die构造函数或main中一样。

对Die.roll的调用非常接近,因此time0实际上每次都返回相同的值,因此,对.roll的每次调用的rand seed都是相同的


尝试调用srandstatic\u casttime0;一次且仅一次在.roll之外,就像在Die构造函数或main中一样。

正如emartel所指出的,您需要的唯一真正的更改是调用timeNULL而不是time0


或者,您可以在构造函数中调用srandtimeNULL,然后在roll中使用rand。

正如emartel所指出的,您需要的唯一真正更改是调用timeNULL而不是time0


或者,您可以在构造函数中调用srandtimeNULL,然后在roll中使用rand。

使用srand一次。目前,它正在一次又一次地播种相同的序列。再加上@chris所说的,这里的关键是srand被快速连续地调用,因此时间总是返回相同的值。在调用srand之前先进行一段时间的睡眠,你会看到行为的改变。你可能想看看这个:使用srand一次。目前,它正在一次又一次地播种相同的序列。再加上@chris所说的,这里的关键是srand被快速连续地调用,因此时间总是返回相同的值。在给srand打电话之前先睡一会儿,你会看到行为的改变。你可能想看看这个:对不起,伙计们。我用PHP得到了一个交叉连接的神经元:-@chris,谢谢你的信任投票,但我的是一个真正的、没有借口的错误。现在存在于太多的方言中,我应该多加注意。它确实存在于C++11中。它只包含了几个名称空间和类:pSorry,伙计们。我用PHP得到了一个交叉连接的神经元:-@chris,谢谢你的信任投票,但我的是一个真正的、没有借口的错误。现在存在于太多的方言中,我应该多加注意。它确实存在于C++11中。它只是包含在几个名称空间和类中:p-1:这不是唯一的问题。我不确定这-1是否值得。根据手册页,使用非空参数调用时间会使时间存储在参数的内存地址中。我想说的是,代码中真正被破坏的是对time0的调用。然后,分别调用srand一次和rand多次。好吧,真正的问题是,OP得到意外结果的原因是时间被快速连续调用,因此返回相同的值。不过,我知道你现在的处境,我会取消否决票。答案并不错误,主要是因为嵌入在构造函数中,但这并不能使它正确。在现代C++中,ELS81239,NULL是0的另一个名称。在指向时间的参数中需要指针的文字0与NULL相同。即使在奇数系统中,空指针的内存表示也不全是零位。当你用一个非null参数调用time时,发生了什么并不重要,因为time不是用一个非null参数调用的。-1:这不是唯一的问题。我不确定-1是否有理由。根据手册页,使用非空参数调用时间会使时间存储在参数的内存地址中。我想说的是,代码中真正被破坏的是对time0的调用。然后,他们分别需要调用srand一次和rand多次。好吧,真正被破坏的东西,例如,OP变得出乎意料的原因
ed结果是时间被快速连续调用,因此返回相同的值。不过,我知道你现在的处境,我会取消否决票。答案并不错误,主要是因为嵌入在构造函数中,但这并不能使它正确。在现代C++中,ELS81239,NULL是0的另一个名称。在指向时间的参数中需要指针的文字0与NULL相同。即使在奇数系统中,空指针的内存表示也不全是零位。当你用一个非空参数调用time时,发生了什么并不重要,因为time不是用一个非空参数调用的。+1感谢你阅读了所有的问题,并给出了正确的答案,而不是“啊哈!”和其他一些不知名的问题一样,我急急忙忙地给出了一个答案:-+1:这才是真正的问题。@Iserni,谢谢:我的“啊哈”时刻到来了,当时我想起了与一个几乎相同的错误斗争+感谢你阅读了所有的问题,并给出了正确的答案,而不是“啊哈!”和其他一些不知名的问题一样,我急急忙忙地给出了一个答案:-+1:这才是真正的问题。@Iserni,谢谢:我的“啊哈”时刻到来了,当时我想起了与一个几乎相同的错误斗争!
#include"die.h"
#include<iostream>
using namespace std;

int main()
{
    Die d;
    d.roll();
    d.printValue();
    d.roll();
    d.printValue();
    d.roll();
    d.printValue();
}