【问题标题】:Problem with rand() in C [duplicate]C中的rand()问题[重复]
【发布时间】:2010-11-14 12:15:22
【问题描述】:

可能重复:
why do i always get the same sequence of random numbers with rand() ?

这是我目前的文件:

#include <stdio.h>

int main(void) {
    int y;
    y = generateRandomNumber();
    printf("\nThe number is: %d\n", y);
    return 0;
}

int generateRandomNumber(void) {
    int x;
    x = rand();
    return x;
}

我的问题是 rand() 总是返回 41。我在 win 上使用 gcc...不知道在这里做什么。

编辑:使用时间生成随机数是行不通的。它为我提供了一个数字(12000ish),每次我打电话时它都会高一点(大约每秒+3)。这不是我需要的随机性。我该怎么办?

【问题讨论】:

标签: c gcc random


【解决方案1】:

这是因为 rand() 隐含地将 seeded 设为 1。

如果您不希望每次运行程序时都使用相同的数字序列,则应在程序启动时设置种子(使用srand()),其值在每次运行时会发生变化。

时钟时间是一个流行的选择,但请记住,这是可预测的,因此如果您希望数字序列不可预测,则可能是一个漏洞。

【讨论】:

  • 嗯。我猜想最初的种子会没有指定(就像 C 中的其他所有东西一样),但果然,它就在手册页中:“如果没有提供种子值,则 rand() 函数会自动播种为值为 1。”
  • @Jason,通过固定种子确定序列有助于测试库。实际应用程序无论如何都需要为生成器播种,并且通常还需要比rand() 更好的生成器。
【解决方案2】:

标准技巧是:

srand(time(0));  // Initialize random number generator.

注意:该函数是 srand,而不是 rand

在您的main 函数中执行一次。之后,只需拨打rand 即可获取号码。

根据实现,它还可以帮助从rand 获取和丢弃一些结果,以允许序列偏离种子值。

【讨论】:

    【解决方案3】:

    在拨打generateRandomNumber 之前尝试拨打srand(time(NULL));

    正如其他人所说,您需要在应用程序启动时调用一次srand(),而不是每次调用rand()

    【讨论】:

    • 这不起作用,因为如果我再次调用它,它会给我一个稍微增加的数字。
    • 确保只播种一次,而不是每次调用 rand()。
    • 你应该只为随机数生成器播种一次
    • 我之前的评论是@akway。我的观点是,在每个 rand() 调用之前进行 srand() 调用会导致随机数不佳。
    • 我的也是。听起来我们都同意
    【解决方案4】:

    有时编译器使用相同的随机种子来帮助更轻松地进行调试,这很好,但违背了随机化的目的。有一些代码示例介绍了如何使用一些数据集(通常是系统时间)为随机生成器播种,但这就是为什么你一遍又一遍地得到相同数字的原因。

    【讨论】:

    • 设置初始种子的是库而不是编译器。它不是“有时”;它是“总是”。
    【解决方案5】:

    和以前一样,一颗种子。经常是类似 time() 或 pid()

    【讨论】:

      【解决方案6】:

      你需要给它一个种子。

      来自互联网 -

      #include <stdio.h>
      #include <stdlib.h>
      #include <time.h>
      
      int main(void)
      {
        int i, stime;
        long ltime;
      
        /* get the current calendar time */
        ltime = time(NULL);
        stime = (unsigned) ltime/2;
        srand(stime);
      
        for(i=0; i<10; i++) printf("%d ", rand());
      
        return 0;
      }
      

      【讨论】:

      • 请注意 time(NULL) 通常足够好,但在某些情况下您需要更多的熵,因此您需要做更多的工作才能找到足够好的种子。我总是觉得很奇怪,为了生成好的伪随机数(rand() 的输出),你首先需要想出一个好的伪随机数(种子)。
      • @Graeme - 在这种情况下,您要查找的词是“Catch-22”。
      猜你喜欢
      • 1970-01-01
      • 2022-01-17
      • 2012-04-20
      • 1970-01-01
      • 1970-01-01
      • 2012-02-05
      • 2017-02-25
      • 1970-01-01
      • 2013-09-13
      相关资源
      最近更新 更多