random , srandom , initstate 或 setstate 子例程

用途

更高效地生成伪随机数。

标准 C 库 (libc.a)

语法

#include <stdlib.h>
long random ( )
void srandom (Seed)
unsigned int Seed;
char *initstate ( Seed,  State,  Number)
unsigned int Seed;
char *State;
size_t Number;
char *setstate (State)
const char *State;

描述

注意: 在多线程环境中,不要使用 随机斯兰初始化状态设置状态 子例程。

随机 子例程使用非线性加法反馈随机数生成器,该生成器使用 31 个长整数的缺省状态数组大小来返回 0 到 2 * *31-1 范围内的连续伪随机数。 这个随机数生成器的周期非常大,大约为 16 * (2 * *31-1)。 状态数组的大小决定了随机数生成器的周期。 增大状态阵列大小会增加时间段。

对于完整的 256 个字节的状态信息,随机数字生成器的 2 大于 2 * *69 ,这对于大多数用途而言应该足够。

随机斯兰 子例程与 兰德斯尔 and 子例程几乎具有相同的调用顺序和初始化属性。 不同的是, 兰德 子例程生成的随机序列要小得多; 实际上, 兰德 子例程生成的低 12 位是经过循环模式的。 随机 子例程生成的所有位都可用。 例如,random( )&01生成随机二进制值。

斯尔 and 子例程不同, 斯兰 子例程不会返回旧种子,因为所使用的状态信息量超过单个字。 初始化状态 子例程和 设置状态 子例程处理重新启动和更改随机数生成器。 但是,与 兰德 子例程一样,缺省情况下, 随机 子例程会生成一系列数字,通过调用以 1 为种子的 斯兰 子例程可以复制这些数字。

初始化状态 子例程允许将作为自变量传入的状态数组初始化以供将来使用。 状态数组的大小 (以字节为单位) 由 初始化状态 子例程使用,以决定它应该使用的随机数生成器的复杂程度; 状态数组越大,数字越随机。 状态信息量的值 8 为 8,32,64,128 和 256 个字节。 对于 8 或等于 8 个字节或小于 32 个字节的数量, 随机 子例程使用简单线性同余随机数生成器,而其他数量将向下舍入为最接近的已知值。 种子值 参数指定随机数序列的起始点,并提供在同一点重新启动的功能。 初始化状态 子例程返回指向先前状态信息数组的指针。

一旦状态被初始化, 设置状态 子例程允许在状态之间快速切换。 状态 参数定义的数组用于进一步的随机数生成,直到调用 初始化状态 子例程或再次调用 设置状态 子例程为止。 设置状态 子例程返回指向先前状态数组的指针。

初始化后,可以通过以下两种方式之一在另一点重新启动状态阵列:

  • 可以将 初始化状态 子例程与期望的种子值,状态数组和数组大小配合使用。
  • 可以使用具有所需状态的 设置状态 子例程,然后是具有所需种子值的 斯兰 子例程。 同时使用这两个子例程的好处是,状态数组的大小在初始化后不必保存。

参数

描述
种子 指定初始种子值。
状态 指示状态信息的数组。
编号 指定状态信息组的大小。

错误代码

如果使用少于 8 个字节的状态信息调用 初始化状态 子例程,或者如果 设置状态 子例程检测到状态信息已损坏,那么会将错误消息发送至标准错误。