【问题标题】:Random generator for guess game猜谜游戏的随机发生器
【发布时间】:2014-06-01 18:10:06
【问题描述】:

我一直在寻找比我自己更好的解决方案,但我真的找不到一个我理解或适合我的解决方案。

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

问题是我随机生成的号码,在查找了很多关于<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

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

有没有更好的方法来随机生成游戏中使用的数字?

【问题讨论】:

标签: c++ random generator


【解决方案1】:

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

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

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

【讨论】:

  • 哦,我之前尝试过使用random_device,但是我的程序在尝试使用它时总是崩溃,猜想我以某种方式错误地实现了它。我也不知道您可以将当前时间用作种子,我曾尝试使用具有常数的种子但没有成功(当然)谢谢您清理它!
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    为什么不简单:

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

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

    【讨论】:

    • 谢谢,之前试过用srand,不知道可以用时间做种子,试了一下,果然奏效了!
    • 那是经典 :) 它让我想起了旧的 RANDOMIZE TIMER
    • 因为它不统一,并且 OP 正在询问最佳解决方案。见:channel9.msdn.com/Events/GoingNative/2013/…
    • @Csq: 公平地说,任何愿意使用default_random_engine 的人都应该同样愿意使用rand(),因为他们被允许成为同一个不统一的廉价和愉快的RNG。但是是的,rand() 的质量始终是个问题。
    • @SteveJessop 还有% 问题,它没有帮助(应该避免使用uniform_int_distribution。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-29
    • 2019-06-02
    • 1970-01-01
    • 2021-07-25
    • 2021-04-21
    • 1970-01-01
    相关资源
    最近更新 更多