随机生成器猜游戏

Random generator for guess game

本文关键字:猜游戏 随机      更新时间:2023-10-16

我一直在寻找一个比我自己的更好的解决方案,我还没有真正能够找到一个我理解或适合我的。

我做了一个简单的游戏,电脑随机生成一个数字,然后你猜一个数字,如果它更高,电脑说更高,等等..

问题是我随机生成的数字,在查找了大量关于<random>, uniform_int_distributiondefault_random_engine的信息后。我发现计算机生成一个随机数,但是如果你再次运行程序,将生成相同的随机数

我的解决方案:

uniform_int_distribution<unsigned> u(0,100); // code to randomly generate numbers between 0 and 100
default_random_engine e; // code to randomly generate numbers
size_t userInput; // User input to find out where to look in the vector
vector<int> randomNumbers; //vector to hold the random numbers
unsigned start = 0, ending = 101, cnt = 0; // used in the game not important right now

cout << "Please enter a number between 1 and 1000 for randomness" << endl;
cin >> userInput;
for(size_t i = 0; i < 1000; ++i){ //for loop to push numbers into the vector
    randomNumbers.push_back(u(e));
}
unsigned guess = randomNumbers[userInput]; // finally the number that the user will have to guess in the game

我现在的解决方案是使用一个向量,我将大量随机生成的数字放入其中,然后要求用户输入一个数字,然后计算机将使用这个数字进行游戏。但应该有更好的方法来做到这一点。所以我的问题是

是否存在更好的方法去随机生成数字并在游戏中使用?

要么使用std::random_device代替std::default_random_engine,要么想办法在每次运行时为引擎提供不同的数字。

这个数字被称为"种子",可以作为可选参数传递给构造函数。由于std::default_random_engine是特定于实现的,并且不同的引擎对播种做不同的事情,如果您提供种子,您通常希望选择特定的引擎。对于任何给定的种子,确定性伪随机数生成器将产生相同的输出序列,因此您希望每次使用不同的种子。

对于像猜谜游戏这样的无安全用途,使用当前时间作为种子最"明显"的东西。一般来说,每次运行程序时,这是不同的,尽管很明显,如果您可以在少于时钟粒度的时间内运行程序两次,那么情况就不是这样了。所以使用时间去播种你的随机引擎是非常有限的,但是对于一个玩具程序来说是可以做到的。

这是因为你的随机数实际上是我们所说的伪随机数生成器

它只是一台机器,给定一个起始数字,它会生成一长串看似随机的数字。由于不提供起始数字,因此生成的随机数列表总是相同的。解决这个问题的一个简单方法是使用当前时间作为起始值或'seed',这是std::default_random_engine的构造函数的一个参数。

您也可以使用您的机器的实数随机数生成器std::random_device作为std::default_random_engine的替代品

为什么不直接:

#include <ctime> // for time()
#include <cstdlib> // for srand()
srand(time(NULL));    // Initializes the rand() function
int randomNumber = rand()%100;    // Random number between 0 and 99.

这样做的目的是在当前时间设置rand()种子,这意味着程序的每次执行都会为rand()设置不同的种子。

仍然是伪随机的解决方案,虽然适合你的目的。