【问题标题】:Why do I get the same result with rand() every time I compile and run?为什么每次编译和运行时使用 rand() 都会得到相同的结果?
【发布时间】:2009-11-23 14:57:57
【问题描述】:

每当我运行此代码时,我都会得到相同的结果。

程序

#include<stdlib.h>

int main(int agrc, const char *argv[]) {
 int i = rand();
 printf("%d\n",i);
 for(i=0;i<10;i++) {
  printf("%d\n",rand());
 }
}

结果:

41
18467
6334
26500
19169
15724
11478
29358
26962
24464
5705

我在mingw 上运行了这个。其实我在学习Objective-C

请帮帮我。

【问题讨论】:

标签: c random


【解决方案1】:

您需要先为 rand 函数设置一个唯一编号,然后才能使用它。最简单的方法是使用time()

例如

srand(time(NULL));
rand();//now returns a random number

原因是 rand()(或任何其他基于算法的函数)提供的随机数不是随机的。 rand 函数只取其当前数值状态,应用转换,将转换结果保存为新状态并返回新状态。

所以要让 rand 返回不同的伪随机数,首先必须将 rand() 的状态设置为唯一的值。

【讨论】:

  • 添加到这个答案:每个种子数(在这种情况下为 time() )将创建一个不同的随机数列表。但是,如果种子 # 相同,则列表将相同。
  • 函数time 接受一个指向time_t 对象的指针。请改用srand(time(NULL));。请注意,在同一秒内多次调用time(NULL) 都会返回相同的值。
【解决方案2】:

你想初始化 PRNG。

通过调用srand() 函数将其初始化一次(通常在main() 内)。

如果您不初始化 PRNG,则默认使用值 1 对其进行初始化。当然,用其他一些常数值初始化它不会为程序的不同运行提供不同的伪随机数。

srand(1); /* same as default */
srand(42); /* no gain, compared to the line above */

您需要使用随程序每次运行而变化的值进行初始化。 time() 函数返回的值是最常用的值。

srand(time(NULL)); /* different pseudo random numbers almost every run */

time(NULL) 的问题在于它在同一秒返回相同的值。所以,如果你在同一天的 11:35:17 调用你的程序两次,你会得到相同的伪随机数。

【讨论】:

    【解决方案3】:

    只是为了补充 Yacoby 的答案 - 我有点惊讶它没有默认为基于时间的种子,所以我查找了 man page

    如果没有提供种子值,则 rand() 函数会自动为种子值 1。

    因此,如果您将代码更改为使用 seed(1),您应该仍会看到相同的输出 - 但 seed(time()) 每次都会更改。

    【讨论】:

    • 它默认为固定种子,因此您可以在必要时从程序中获得可重现的结果(例如,在测试、调试、yaddah、yaddah 期间)。
    【解决方案4】:

    rand 的输出是 pseudo-random,这意味着它看起来实际上是随机的,但每次都以相同的方式计算,从一个称为种子。使用相同的种子值,您将获得相同的随机数序列。

    要设置不同的种子,请在开始生成随机数之前在代码中使用一次标准 C 函数 void srand(unsigned int)。每次运行程序时获取不同随机数序列的一种常见方法是将种子基于时钟时间。例如。 srand(clock())

    【讨论】:

      猜你喜欢
      • 2018-12-24
      • 2012-03-16
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 2013-09-23
      相关资源
      最近更新 更多