猜测游戏的随机发生器

时间:2014-06-01 18:10:07

标签: c++ random generator

我一直在寻找比我自己更好的解决方案,而且我真的找不到一个我理解或对我有用的解决方案。

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

问题是我在查找有关<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

我现在的解决方案是使用向量,其中我推送了大量随机生成的数字,然后要求用户键入一个计算机用于游戏的数字。但应该有更好的方法来做到这一点。因此我的问题是

是否有更好的方法可以随机生成要在游戏中使用的数字?

3 个答案:

答案 0 :(得分:5)

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

这个号码叫做种子&#34;并且可以作为可选参数传递给构造函数。由于std::default_random_engine是特定于实现的,并且不同的引擎在播种方面做了不同的事情,因此如果您要提供种子,通常需要选择特定的引擎。确定性伪随机数生成器将为任何给定种子生成相同的输出序列,因此您希望每次都使用不同的种子。

对于像猜谜游戏这样的非安全用途,最明显的&#34;显而易见的&#34;用作种子的东西是当前时间。一般来说,每次运行程序时这都是不同的,尽管很明显,如果你可以在低于时钟粒度的情况下运行程序两次,那么事实并非如此。因此,使用时间为随机引擎播种是非常有限的,但它可以完成玩具程序的工作。

答案 1 :(得分:1)

为什么不简单:

#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()的不同种子。

仍然只是伪随机解决方案,但适用于您的目的。

答案 2 :(得分:1)

那是因为你的随机数实际上就是我们所谓的pseudorandom number generator

这只是一台给出起始编号的机器,它会生成一大堆看似随机的数字。由于您未提供起始编号,因此生成的随机数列表始终相同。解决此问题的一种简单方法是使用当前时间作为起始值或“种子”,这是std::default_random_engine的构造函数的参数。

您还可以使用机器实际随机数生成器std::random_device代替std::default_random_engine