1

下面是我练习使用 rand() 函数的示例程序。

最奇怪的是,每次运行程序时,rand() 生成的第一个数字(程序输出中的 rand[0])都是 SIMILAR。它不一样,但这个数字总是比上次生成的时候略大。然而,rand[1-4] 似乎是可以接受的随机性。谁能解释发生了什么,为什么?

看看这个示例输出:

[paul@experimental C] $ ./a.out
rand[0]= 277735441                  <<<??????
rand[1]= 1417591956
rand[2]= 1284424674
rand[3]= 819876274
rand[4]= 1405457966
[paul@experimental C] $ ./a.out
rand[0]= 277769055                  <<<???????
rand[1]= 1982542454
rand[2]= 234757526
rand[3]= 642279943
rand[4]= 1546192179
[paul@experimental C] $ ./a.out
rand[0]= 277785862                  <<<??????? 
rand[1]= 117534056
rand[2]= 1857407599
rand[3]= 1627223601
rand[4]= 542817462

源代码:

 /*
     * rand: Generates 5 numbers using standard "srand()/rand()" function
     *
     * SAMPLE OUTPUT:
     *   rand[0]= 824522256
     *   rand[1]= 1360907941
     *   rand[2]= 1513675795
     *   rand[3]= 1046462087
     *   rand[4]= 253823980
     */
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>

    int
    main (int argc, char *argv[])
    {
      /* Simple "srand()" seed: just use "time()" */
      unsigned int iseed = (unsigned int)time(0);
      srand (iseed);

      /* Now generate 5 pseudo-random numbers */
      int i;
      for (i=0; i<5; i++)
      {
        printf ("rand[%d]= %u\n",
          i, rand ());
      }
      return 0;
    }
4

4 回答 4

4

一个常见的实现是srand让第一个随机数与其种子高度相关。该标准不保证序列的随机性。

于 2011-09-14T22:57:42.337 回答
0

那么基本上 rand() 是一个伪随机生成器。由于您使用 time() 播种,这可能是数字相似的原因。

尝试使用 gettimeofday() 乘以 tv_sec * tv_usec 或类似的方法播种。

于 2011-09-14T22:59:00.043 回答
0

rand返回一个有符号整数。您将其打印为无符号值。

于 2011-09-14T22:54:26.470 回答
0

伪随机生成器从来都不是真正随机的,而是基于各种各样的数学算法。在我的系统上,根据手册页,显然使用了一个相当简单的系统:

static unsigned long next = 1;

    /* RAND_MAX assumed to be 32767 */
    int myrand(void) {
    next = next * 1103515245 + 12345;
        return((unsigned)(next/65536) % 32768);
    }

    void mysrand(unsigned seed) {
        next = seed;
    }

这些类型的随机发生器已经存在了一段时间。如果你熟悉余数运算,那么你会看到你取了一个起始值,然后用相对于 32768 的余数扭转和转动它,从而得到一个在你的机器承诺的范围内的值。不过,这一切都不是随机的。然后将您产生的值用作下一个数字的起始值。

在您的情况下,您使用当前时间播种。如果你运行程序足够快,你甚至可能得到相同的值(这不应该发生,但是当我编译你的小程序并在我的系统上运行它时它对我有用)。在任何情况下,如果您有一个在另一个之后快速运行,您可能会看到相似的值 - 直到您“翻转”剩余的基础。

也许在这里阅读随机数生成:

http://en.wikipedia.org/wiki/Pseudorandom_number_generator

它会更有意义。

编辑:如果您想知道人们是如何想出用于乘以您的种子值的常量,那么伪随机生成器的质量将根据许多标准进行评估,例如,结果值是“随机外观”还是“聚集” '。如果您需要非常好的伪随机数(现在可能不需要),您可能想要实现自己的。

于 2011-09-14T23:10:15.180 回答