【问题标题】:Sequential Random Numbers C++ [closed]顺序随机数 C++ [关闭]
【发布时间】:2014-11-30 23:21:31
【问题描述】:

我试图从字典中选择一个随机单词,而不是给我随机数字,每次我运行程序时数字都会依次增加,例如,如果我运行一次 17010,我会得到大约 17025 或所以下一次运行。

这是我的代码: 如果有帮助,字典的长度约为 44000。

    //I initialize srand(time(0)) in my main function
    int numRand = std::rand()%Dictionary.size();
    std::string wordOne = Dictionary[numRand].getWord();
    sylCount -= Dictionary[numRand].getSylls();

提前致谢!

【问题讨论】:

  • 忘记调用srand() 为随机数引擎播种?例如。在您的main() 中调用一次srand(time(NULL));
  • 不要使用rand(),这是最糟糕的 PRNG 之一。使用来自 Boost 的不错的 PRNG,例如 mt19937。
  • 17010 和 17025 不连续
  • @pjs:mt19337 不需要 Boost。它在std:: 中,只需包含<random>

标签: c++ random


【解决方案1】:

如果你可以使用 C++11,你可以使用它的<random> 库。查看here 获取文档。更喜欢mt19937 生成器——它比rand() 或类似的东西质量更高。

如果您需要在每次运行程序时顺序增加数字,则需要在程序终止时将数字保存到文件中,然后将其重新加载并在循环中执行随机数生成,等到你得到一个比前一个更大的数字。 (老实说,我不太清楚为什么每次运行程序时都需要增加它 - 这会破坏程序的再现能力,这将大大妨碍您执行测试的能力。)

【讨论】:

  • 谢谢,太好了。我认为 mt19937 绝对是更强的选择。也感谢您的解释。
【解决方案2】:

取模运算符 (%) 不是一个好主意,因为如果 rand() 的范围不是字典大小的倍数,它就不是随机的。

即如果 rand() 的范围是 0-9 并且字典的大小为 9,则输出为 0 的机会将是任何其他数字的两倍,因为 0%9=0 和 9%9=0。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    • 2022-12-06
    相关资源
    最近更新 更多