【问题标题】:rand() generating the same number [duplicate]rand()产生相同的数字[重复]
【发布时间】:2012-11-21 19:17:54
【问题描述】:

可能重复:
rand function returns same values when called within a single function c++

为什么 rand() 生成相同的数字?

死.h

#ifndef DIE_H
#define DIE_H


class Die
{
private:
    int number;
public:
    Die(){number=0;}
    void roll();
    int getNumber()const{return number;}
    void printValue();
};

#endif

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

【问题讨论】:

  • 使用一次srand。它目前正在一遍又一遍地播种相同的序列。
  • 补充@chris 所说的,这里的关键是srand 被快速连续调用,因此time 总是返回相同的值。在打电话给srand 之前先睡一会(大约一秒钟),你就会看到行为发生了变化。
  • 你可能想看看这个:stackoverflow.com/questions/2254909/…

标签: c++ visual-c++


【解决方案1】:

您对die.roll() 的调用非常接近,以至于time(0) 实际上每次都返回相同的值,因此,对于.roll() 的每次调用,您的 rand 种子都是相同的。

尝试在.roll() 之外调用srand(static_cast&lt;int&gt;(time(0))); 一次(并且仅一次)(如在 Die 构造函数或main() 中)。

【讨论】:

  • +1 表示已阅读所有问题,并提出正确答案,而不是像其他一些未命名的问题一样匆忙回答 :-)
  • +1:这真正的问题。
  • @Iserni,谢谢 :) 当我想起与这个几乎相同的错误时,我的“啊哈”时刻来了!
【解决方案2】:

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

这通常以srand(time(NULL)) 开头。

rand() 生成的数字不是随机的,它们是*伪*随机的:给定相同的种子,它总是会返回相同的序列。默认情况下,我相信初始种子为零(但是,在程序运行之间肯定总是相同的 - 所以如果没有种子,你每次都会得到相同的明显随机序列)。

【讨论】:

  • 对不起,伙计们。我用 PHP 得到了一个交联的神经元 :-(
  • @chris,感谢您的信任投票,但我的错误是真正的,没有任何借口的错误。 now()的方言太多了,应该多加注意。
  • 嗯,它确实存在于 C++11 中。它只是包含在几个命名空间和类中:p
【解决方案3】:

正如 emartel 所指出的,您需要的唯一真正更改是调用 time(NULL) 而不是 time(0)

您也可以在构造函数中调用srand(time(NULL)),然后在roll() 中使用rand()

【讨论】:

  • -1:这不是(唯一的)问题。
  • 我不确定这个 -1 是否合理。根据手册页调用时间带有非空参数会导致时间存储在参数的内存地址中。所以我说代码中真正被破坏的是对 time(0) 的调用。然后,他们需要分别调用 srand 一次和 rand 多次。
  • 嗯,真正被破坏的事情(例如,OP 得到意外结果的原因)是time 被快速连续调用,因此返回相同的值。但是,我知道您现在从哪里来,我将删除反对票。答案没有错,主要是因为嵌入了“在构造函数中”,但这并不能使它正确。
  • @ers81239 在现代 C++ 中,NULL 实际上是 0 的另一个名称。需要指针的字面量 0(如在 time 的参数中)与 NULL 相同。即使在空指针的内存表示并非全为零位的古怪系统上也是如此。当您使用非空参数调用 time 时发生什么并不重要,因为 time 不是使用非空参数调用的。
猜你喜欢
  • 2021-11-03
  • 2012-03-14
  • 2017-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-16
  • 1970-01-01
相关资源
最近更新 更多