随机数

来源:互联网 发布:php如何获取表单数据 编辑:程序博客网 时间:2024/04/24 15:59
1. 如何产生一定范围内的随机数?

直接的方法是:

  rand() % N;

返回从 0 到 N - 1 的数字。但这个方法不好,因为许多随机数发生器的低位比特并不随机。一个较好的方法是:

  (int)((double)rand() / ((double)RAND_MAX + 1) * N);

如果你不希望使用 double,另一个方法是:

  rand() / (RAND_MAX / N + 1);

两种方法都需要知道 RAND_MAX,而且假设 N 要远远小于 RAND_MAX。ANSI 规定标准头文件 stdlib.h 中包含 RAND_MAX 的 #define。顺便提一下,RAND_MAX 是个常数,它告诉你 C 库函数 rand() 的固定范围。你不可以设 RAND_MAX 为其它的值,也没有办法要求 rand() 返回其它范围的值。如果你用的随机数发生器返回的是 0 到 1 的浮点值,要取得范围在 0 到 N - 1 内的整数,只要将随机数乘以 N 就可以了。


2. 为什么每次执行程序,rand() 都返回相同顺序的数字?

  你可以调用 srand() 来初始化伪随机数发生器的种子,传递给 srand() 的值应该是真正的随机数,例如当前时间:

  #include <stdlib.h>
  #include <time.h>
  srand((unsigned int)time((time_t *)NULL));

请注意,在一个程序执行中多次调用 srand() 并不见得有帮助!不要为了取得“真随机数”而在每次调用 rand() 前都调用 srand()!


3. 我需要随机的真/假值,所以我用直接用 rand() % 2,可是我得到交替的 0, 1, 0, 1, 0 。

  这是个低劣的伪随机数生成器,在低位比特中不随机!很不幸,某些系统就提供这样的伪随机数生成器。请试着使用高位比特,具体请参考本文第 1 点。

原创粉丝点击