C++ 猜谜游戏的随机发生器

C++ 猜谜游戏的随机发生器,c++,random,generator,C++,Random,Generator,我一直在寻找一个比我自己的更好的解决方案,但我还没有真正找到一个我理解或对我有效的解决方案 我做了一个简单的游戏,电脑随机生成一个数字,然后你猜一个数字,如果数字越高,电脑就会说越高,以此类推 问题是我随机生成的数字,在查找了大量关于统一分布和默认随机引擎的信息之后。我发现计算机会生成一个随机数,但是如果你再次运行这个程序,就会生成相同的随机数 我的解决方案: uniform_int_distribution<unsigned> u(0,100); // code to random

我一直在寻找一个比我自己的更好的解决方案,但我还没有真正找到一个我理解或对我有效的解决方案

我做了一个简单的游戏,电脑随机生成一个数字,然后你猜一个数字,如果数字越高,电脑就会说越高,以此类推

问题是我随机生成的数字,在查找了大量关于统一分布和默认随机引擎的信息之后。我发现计算机会生成一个随机数,但是如果你再次运行这个程序,就会生成相同的随机数

我的解决方案:

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
我现在的解决方案是使用一个向量,我将大量随机生成的数字输入,然后让用户键入一个数字,然后计算机将其用于游戏。但应该有更好的方法来做到这一点。因此,我的问题是

有没有更好的方法来随机生成游戏中使用的数字?为什么不简单:

#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种子

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

使用std::random\u设备代替std::default\u random\u引擎,或者想出一种方法,在引擎每次运行时为其提供不同的数字

这个数字称为种子,可以作为可选参数传递给构造函数。由于std::default_random_引擎是特定于实现的,不同的引擎在种子设定方面做不同的事情,所以如果您提供种子设定,通常需要选择特定的引擎。确定性伪随机数生成器将为任何给定种子生成相同的输出序列,因此每次都要使用不同的种子


因为没有像猜谜游戏那样的安全性用途,最明显的种子是当前时间。一般来说,每次运行程序时,这都是不同的,尽管很明显,如果可以在小于时钟粒度的时间内运行两次程序,则情况并非如此。因此,使用时间为随机引擎播种是非常有限的,但可以为一个玩具程序完成这项工作。

这是因为你的随机数实际上就是我们所说的随机数

它只是一台机器,给定一个起始数字,就会生成一大串看似随机的数字。由于您没有提供起始编号,因此生成的随机编号列表总是相同的。解决此问题的一个简单方法是使用当前时间作为起始值或“种子”,这是std::default\u random\u引擎的构造函数的参数


您也可以使用您的机器真实随机数生成器std::random_设备作为std::default_random_引擎的替代品

似乎与之主题相同。答案建议使用std::default_random_engine enginestd::random_device{}设置种子;哦,我以前试过使用random_设备,但我的程序在尝试使用它时总是崩溃,我猜我是因为某种原因错误地实现了它。我也不知道你可以将当前时间用作一个种子,我曾尝试使用一个固定数字的种子,但没有成功。当然,谢谢你清理它!谢谢你,我以前试过使用srand,但不知道你可以把时间当作种子,试过了,它成功了!这是一个经典:它让我想起了旧的随机化时间,因为它不是统一的,OP要求最好的解决方案。请参阅:@Csq:公平地说,任何愿意使用默认随机引擎的人都应该同样愿意使用兰德,因为他们被允许使用相同的非统一的廉价和愉快的RNG。但是是的,兰德的质量总是一个问题。@SteveJessop还有%的问题,这没有帮助,应该通过使用统一的分布来避免。