【问题标题】:How to get random number generator to work properly [duplicate]如何让随机数生成器正常工作[重复]
【发布时间】:2019-08-22 13:30:03
【问题描述】:

我的代码处理两个骰子(一个 10 面“公平”骰子和一个 20 面“公平”骰子),并使用类、数组和随机数生成器生成两个骰子的随机掷骰及其总和,但所有我的代码吐出是“你滚:18”。这不是很随机。


#include <iostream>
#include <stdlib.h>

using namespace std;

class Dice
{
  private:
  int rollDice[2] = {};

  public:
  void setval1(int x)
  {
    rollDice[0] = x;
  }

  void setval2(int y)
  {
    rollDice[1] = y;
  }

  double getVal1()
    {
      return rollDice[0];
    }

  double getVal2()
  {
    return rollDice[1];
  }
};

int main()
 {
  Dice a;
  a.setval1(rand()%9+1);
  a.setval2(rand()%19+1);
  cout << "You rolled: " << a.getVal1() + a.getVal2();
}

【问题讨论】:

  • 你必须看到随机生成器
  • 您应该先致电srand。此外,从 C++11 开始,您应该使用 &lt;random&gt;

标签: c++ arrays class random


【解决方案1】:

来自documentation

您需要播种使用的伪随机数生成器 标准::兰德()。如果在调用 srand() 之前使用了 rand(),则 rand() 表现得好像它是用 srand(1) 播种的。

每次 rand() 播种相同的种子,它必须产生 相同的值序列。

C++ 中的正确用法应该是这样的:

std::srand(std::time(nullptr)); // use current time as seed for random generator
int random_variable = std::rand();

如果你想要一个特定的统计分布,你应该看看随机的标题documentation

【讨论】:

  • 那将如何在我的代码中实现?另外,我对您的评论“使用当前时间作为随机生成器的种子”的意思感到困惑。
  • 我很抱歉。我对 C++ 还是比较陌生。 @Clonk
  • 计算机中不存在真正的随机性。因此,电脑使用pseudo-random。对于给定的分布和种子,“随机”数字的序列将始终相同。如果您使用相同的种子重新初始化生成器,您将获得相同的数字。 CPU 的系统时间/滴答数是获取每次运行都不同的整数的好方法。因此,除非您需要为加密目的生成随机数,否则通常可以将其用作种子以在每次运行时获得不同的序列。
  • @AstroNOT98 另外记得在main()的开头只播种1次。不要在每次需要新的随机数时尝试播种。一些用户做后者,然后问为什么这些数字不是随机的。如果您在循环中播种,请记住时钟的分辨率为 1 秒,因此它将在一秒钟内提供相同的种子。相同的种子意味着相同的随机数。这就是为什么最好在 main() 开始时只播种 1 次。
猜你喜欢
  • 2010-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-07
  • 1970-01-01
  • 2021-09-16
  • 2011-11-24
  • 1970-01-01
相关资源
最近更新 更多