首页 > 编程知识 正文

随机数C语言,c语言单词表

时间:2023-05-05 18:31:27 阅读:135308 作者:3573

头文件: #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的伪随机数序列。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。