头文件: #include
函数原型: longintrandom;
voidsrandom(unsignedintseed;
char*
initstate(unsignedintseed,char* state,size_t n );
char*setstate(char*state );
输入(void );
输入
rand_r(unsignedint*seedp );
void
srand(unsignedintseed;
请注意以下事项:
1、random和rand的区别
许多编译器的rand(gcc除外) rand函数都采用乘法。 该算法相对简单,生成的随机数的非重复周期短(一般小于2**sizeof(int ) )。 另一方面,random函数采用了“非线性增长-反馈”算法,该算法生成的随机数具有长的非重复周期(一般为16 ) *sizeof(int )-1 )。 联合算法生成的随机数不重复周期是因为,即使next为unsigned,在各步骤的循环后也只有一个变量next被传递到下一个循环
int型也只有64位,但“非线性增长—反馈”算法在循环之间传递一系列变量常数,最大为2048位(最低64位,与线性算法相同),大大增加了有限状态机的状态数,使周期
random函数实现起来很复杂,比rand函数慢一点,但由于重复周期长,所以不需要频繁初始化。
random的返回值为long int型,rand函数的返回值为int型。
全等rand函数和srand函数的实现示例:
static unsigned long int next; //next的定义
输入
myrand//rand函数的实现版本
{
next=next * 1103515245 12345;
返回((unsigned ) ) next/65536 ) % 32768 );
}
voidmysrand(unsignedseed )//srand函数的实现版本
{
下一个种子;
}
GCC的rand函数采用“非线性增长-反馈”算法,但高阶随机率和低阶随机率相同。 但是,因为是在更旧的版本和不同的系统中可能采用的乘法(高位随机率比低位随机率高),所以为了互换性,取某个范围内的随机数时需要取高位。
ifyouwanttogeneratearandomintegerbetween1and 10,you
shouldalwaysdoitbyusinghigh-order bits,as
in
j=1(int ) ) 10.0* ) rand )/)/(RAND_MAX 1.0 ) );
and never by anything resembling
j=1(rand( ();
(which uses lower-order bits )。
2、rand和rand_r的区别
rand函数不是线程安全的。 必须更改状态值,如next值,而无需调用任何rand函数。 由于这些状态在同一进程的不同线程之间共享,每个线程调用rand函数会影响其他线程对rand的使用,因此在多线程环境中必须使用显式指定seed值的rand_r函数。
3、srand (与srandom相同) )。
srand函数指定rand函数的种子。 如果在调用rand函数之前没有调用srand函数,则默认rand函数的种子为1。 如果srand指定的种子没有变化,则每次运行生成的随机数序列相同。 如果srand按指定的seed不同,则每次执行生成的随机数序列不同。 每个种子对应一系列伪随机数序列,不同的种子对应不同的伪随机数序列。 要使每次执行生成的随机数序列不同,可以将以下变量参数传递给srand函数
srand () unsigned (time (0) )0); 要使用time函数,必须引入头文件#include。
4、RAND_MAX的值一般为2**(sizeof(int )-1 );
5、rand_r函数的调用不影响rand函数。 这意味着,如果调用rand_r函数,然后调用以前未调用srand函数的rand函数,rand函数将生成缺省种子值为1的伪随机数序列。