我目前停留在运行时生成随机数。在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)不会改变这一点。数字总是一样的。安全性不是问题,它是一个非常简单的应用程序。
答案 0 :(得分:7)
随机数生成器与seed一起使用。基本上它是一个只能为随机数生成器设置一次的数字。如果每次尝试生成一个数字时重新播种随机数生成器,每次都会得到相同的数字。您应该只创建一次std::mt19937
对象。
答案 1 :(得分:2)
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。