【问题标题】:rand() returns the same number each time the program is runrand() 每次运行程序时返回相同的数字
【发布时间】:2021-12-20 19:45:39
【问题描述】:

在这个涉及随机数生成的相当基本的 C++ 代码 sn-p 中:

include <iostream>
using namespace std;

int main() {
    cout << (rand() % 100);
    return 0;
}

为什么我总是得到 41 的输出?我试图让它输出一些介于 0 和 100 之间的随机数。也许我不了解 rand 函数的工作原理?

【问题讨论】:

  • 41个随机数还不够吗?我肯定不会想到...
  • @0x90: 其实也不是“C 代码 sn-p”!
  • 可能你的电脑有问题。它认为这是深度思考,但一直得到 41 而不是 42。至少它做得很快,而不是 750 万年。
  • 这个神秘语言CC++的又一个问题。我怎么只在SO上听说过?

标签: c++ random


【解决方案1】:

您需要更改seed

int main() {

    srand(time(NULL));
    cout << (rand() % 101);
    return 0;
}

srand 播种对于c 语言代码也是如此。


另请参阅: http://xkcd.com/221/

【讨论】:

    【解决方案2】:

    您需要“播种”生成器。看看这个简短的视频,它会澄清一切。

    https://www.thenewboston.com/videos.php?cat=16&video=17503

    【讨论】:

      【解决方案3】:

      对于它的价值,您也只能生成 0 到 99(含)之间的数字。如果您想生成介于 0 和 100 之间的值,则需要。

      rand() % 101
      

      除了其他人提到的调用 srand() 之外。

      【讨论】:

      • 此外,数字不会均匀分布,因为 rand 不太可能返回均匀分布在 101 的精确倍数上的数字。
      【解决方案4】:

      你没有播种号码。

      使用这个:

      #include <iostream>
      #include <ctime>
      
      using namespace std;
      
      int main()
      {
          srand(static_cast<unsigned int>(time(0)));
          cout << (rand() % 100) << endl;
          return 0;
      }
      

      不过,您只需要播种一次。基本上不要为每个随机数播种。

      【讨论】:

        【解决方案5】:

        srand() 为随机数生成器提供种子。没有种子,生成器就无法生成您要查找的数字。只要对随机数的需求不是安全关键(例如任何类型的密码学),通常的做法是通过使用来自&lt;ctime&gt; 库的time() 函数来使用系统时间作为种子:@987654327 @。这将使用以 Unix 时间戳表示的系统时间(即自 1970 年 1 月 1 日以来的秒数)作为随机数生成器的种子。然后您可以使用rand() 生成一个伪随机数。

        这是来自duplicate question的引用:

        原因是 rand() 函数生成的随机数不是 实际上是随机的。这简直是​​一种转变。维基百科提供了更好的 伪随机数发生器含义解释:确定性 随机位发生器。每次调用 rand() 时,它都会获取种子和/或 生成的最后一个随机数(C 标准未指定算法 使用过,尽管 C++11 有指定一些流行算法的工具),运行 对这些数字进行数学运算,并返回结果。所以如果 种子状态每次都是相同的(如果您不使用真正的 随机数),那么您将始终得到相同的“随机”数字。

        如果你想了解更多,可以阅读以下内容:

        http://www.dreamincode.net/forums/topic/24225-random-number-generation-102/

        http://www.dreamincode.net/forums/topic/29294-making-pseudo-random-number-generators-more-random/

        【讨论】:

          【解决方案6】:

          随机函数,如 borland 编译器

          using namespace std;
          
          int sys_random(int min, int max) {
             return (rand() % (max - min+1) + min);
          }
          
          void sys_randomize() {
              srand(time(0));
          }
          

          【讨论】:

            猜你喜欢
            • 2023-01-22
            • 1970-01-01
            • 2012-03-16
            • 2017-07-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多