【问题标题】:C++ random numbers are always the sameC++ 随机数总是相同的
【发布时间】:2016-08-26 11:40:42
【问题描述】:

我目前被困在运行时生成随机数。在 Java 中,我只需调用 Math.random() 就完成了(我只需要一个简单的 RNG)。在 C++ 中,我尝试了几种生成随机数的方法,但最终总是得到相同的结果。

目前,我正在使用以下方法来获取 MIN 和 MAX 之间的随机数:

unsigned int getRandomNumber(int min, int max){
    std::mt19937 mt(1729);
    std::uniform_int_distribution<int> dist(min, max);
    return dist(mt);
}

我有一个对象在其构造函数中调用此函数并将返回的值分配给属性。我目前创建了该对象的五个实例,并且随机数始终相同。设置大范围(1 - 1000)不会改变这一点。数字始终相同。安全性不是问题,它是一个极其简单的应用程序。

【问题讨论】:

  • 您每次都为随机数生成器提供相同的种子值。只需在程序中使用一次
  • 感谢您的链接!

标签: c++ random


【解决方案1】:
unsigned int getRandomNumber(int min, int max){
    static std::mt19937 mt(1729);
    std::uniform_int_distribution<int> dist(min, max);
    return dist(mt);
}

mt设为静态将导致它只被实例化一次,这意味着它只会被构造一次,这意味着它只会被播种一次。即使使用此修复程序,每次运行程序时仍会得到相同的数字序列,但每次调用 getRandomNumber 时它们会有所不同。

更好的解决方案是在别处实例化 mt 变量,并将其作为参数传递给此函数,这样您就可以管理如何使用更多代码来播种,而不仅仅是构造函数调用。通常,您会使用基于时间的值来播种。很多见解here

【讨论】:

    【解决方案2】:

    随机数生成器与seed 一起使用。基本上它是一个只设置一次的数字,随机数生成器可以使用。如果您每次尝试生成一个数字时都重新播种随机数生成器,那么您每次都会得到相同的数字。您应该只创建一次std::mt19937 对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-28
      • 1970-01-01
      • 2015-11-23
      • 2012-12-27
      • 1970-01-01
      • 1970-01-01
      • 2020-09-30
      • 1970-01-01
      相关资源
      最近更新 更多