详解srand()与rand(),越详细越好,最后带上程序跟注释

详解srand()与rand(),越详细越好,最后带上程序跟注释,第1张

srand和rand()配合使用产生伪随机数序列。

rand函数在产生随机数前,需要系统提供的生成伪随机数序列的种子  (由srand函数提供),rand根据这个种子的值产生一系列随机数。

如果系统提供的种子没有变化(这里的种子是指srand根据参数seed生成的种子),每次调用rand函数生成的伪随机数序列都是一样的。

srand(unsigned seed)通过参数seed改变系统提供的种子值,从而可以使得每次调用rand函数生成的伪随机数序列不同,从而实现真正意义上的“随机”。

通常可以利用系统时间来改变系统的种子值,即srand(time(NULL))    (time(0)或者time(NULL)是系统函数,调用之前要先引入timeh文件,time(0)可以动态获取系统时间  ),可以为rand函数提供不同的种子值,进而产生不同的随机数序列。

是的,头文件stdlibh里包含了srand和rand函数。如果没有调用srand,那么rand将产生相同的随机数“序列”——就是说如果第一次循环调用rand产生的随机数序列是88,2,33,55……的话,第二次启动循环调用rand产生的随机数序列仍然是88,2,33,55……产生这一问题的根本原因是伪随机序列发生器的初始状态没有发生变化造成的。srand函数的功能就是来改变伪随机序列发生器的初始状态。srand向伪随机序列发生器的初始状态寄存器写入不同的值(状态字),就能使rand函数产生不同的序列,就解决了“序列重复”的问题。显然,人为安排状态字是不现实的,因为安排了就变不了了。所以用NULL来调用time函数获致系统时钟值转换成无符号整数数作为srand的参数,这样每调用一次srand都会写入不同的初始状态字(因为时钟每时每刻都是变化的),就达到目的了。

那就算了吧!我不知道与哪个长得像,这里没有一个像的,也没有一个真正讲出要用srand的原因。我写的时候谁的都没有参考,别说是复制。如果可以,把认为复制的答案弄出来我看看。

rand(产生随机数)

相关函数

srand

表头文件

#include<stdlibh>

定义函数

int rand(void)

函数说明

rand()会返回一随机数值,范围在0至RAND_MAX 间。在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。关于随机数种子请参考srand()。

返回值

返回0至RAND_MAX之间的随机数值,RAND_MAX定义在stdlibh,其值为2147483647。

范例

/ 产生介于1 到10 间的随机数值,此范例未设随机数种子,完整的随机数产生请参考

srand()/

#include<stdlibh>

main()

{

int i,j;

for(i=0;i<10;i++)

{

j=1+(int)(100rand()/(RAND_MAX+10));

printf("%d ",j);

}

}

执行

9 4 8 8 10 2 4 8 3 6

9 4 8 8 10 2 4 8 3 6

srand(设置随机数种子)

相关函数

rand

表头文件

#include<stdlibh>

定义函数

void srand (unsigned int seed);

函数说明

srand()用来设置rand()产生随机数时的随机数种子。参数seed必须是个整数,通常可以利用geypid()或time(0)的返回值来当做seed。如果每次seed都设相同值,rand()所产生的随机数值每次就会一样。

返回值

范例

/ 产生介于1 到10 间的随机数值,此范例与执行结果可与rand()参照/

#include<timeh>

#include<stdlibh>

main()

{

int i,j;

srand((int)time(0));

for(i=0;i<10;i++)

{

j=1+(int)(100rand()/(RAND_MAX+10));

printf(" %d ",j);

}

}

执行

5 8 8 8 10 2 10 8 9 9

2 9 7 4 10 3 2 10 8 7

“srand(time(NULL));”这条指令的意思是利用系统时间来初始化系统随机数的种子值,使得每次运行由于时间不同产生而产生不同的随机数序列。

srand函数是随机数发生器的初始化函数。它的原型是“void srand(unsigned int seed);”srand和rand()配合使用产生伪随机数序列。

rand函数在产生随机数前,需要系统提供的生成伪随机数序列的种子,rand根据这个种子的值产生一系列随机数。如果系统提供的种子没有变化,每次调用rand函数生成的伪随机数序列都是一样的。

srand(unsigned seed)函数通过参数seed来改变系统提供的种子值,从而可以使得每次调用rand函数生成的伪随机数序列不同,从而实现真正意义上的“随机”。

通常可以利用系统时间来改变系统的种子值,即srand(time(NULL)),可以为rand函数提供不同的种子值,进而产生不同的随机数序列。

扩展资料:

rand()函数的使用注意事项:

1、使用该函数首先应在开头包含头文件stdlibh。

2、在标准的C库中函数rand()可以生成0~RAND_MAX之间的一个随机数,其中RAND_MAX 是stdlibh 中定义的一个整数,它与系统有关。

3、rand()函数没有输入参数,直接通过表达式rand()来引用。

4、因为rand()函数是按指定的顺序来产生整数,因此每次执行上面的语句都打印相同的两个值,所以C语言的随机并不是真正意义上的随机,有时候也叫伪随机数。

5、为了使程序在每次执行时都能生成一个新序列的随机值,我们通常通过伪随机数生成器提供一粒新的随机种子。函数 srand()(来自stdlibh)可以为随机数生成器播散种子。只要种子不同,rand()函数就会产生不同的随机数序列。srand()称为随机数生成器的初始化器。

-srand

先用srand函数设置一个种子,一般为当前时间,然后使用rand函数产生随机数,如产生a~b的随机数使用表达式rand()%(b-a+1)+a。

注意:srand函数在头文件#include

<stdlibh>中。

示例代码:

#include <stdioh>

#include <stdlibh>

#include <timeh>

int main()

{

int a[10]/用于保存10个产生的随机数/, i;

srand((unsigned int)time(NULL));//设置当前时间为种子

for (i = 0; i < 10; ++i){

a[i] = rand()%100+1;//产生1~100的随机数

}

//打印生成的随机数

for (i = 0; i < 10; ++i){

printf ("%d ", a[i]);

}

printf ("\n");

return 0;

}

  srand函数是随机数发生器的初始化函数。

  原型:void

srand(unsigned

seed);

  用法:它需要提供一个种子,这个种子会对应一个随机数,如果使用相同的种子后面的rand()函数会出现一样的随机数。如:

srand(1);

直接使用1来初始化种子。不过为了防止随机数每次重复常常使用系统时间来初始化,即使用

time函数来获得系统时间,它的返回值为从

00:00:00

GMT,

January

1,

1970

到现在所持续的秒数,然后将time_t型数据转化为(unsigned)型再传给srand函数,即:

srand((unsigned)

time(&t));

还有一个经常用法,不需要定义time_t型t变量,即:

srand((unsigned)

time(NULL));

直接传入一个空指针,因为你的程序中往往并不需要经过参数获得的t数据。srand((int)getpid());

使用程序的ID(getpid())来作为初始化种子,在同一个程序中这个种子是固定的。

srand函数是随机数发生器的初始化函数。原型:void srand(unsigned int seed);srand和rand()配合使用产生伪随机数序列。

srand函数是随机数发生器的初始化函数。

原型:void srand(unsigned seed)。

用法:相同的种子会产生相同的随机数,一般使用系统时间产生随机数。即使用time()获得。

rand函数在产生随机数前,需要系统提供的生成伪随机数序列的种子,rand根据这个种子的值产生一系列随机数。如果系统提供的种子没有变化,每次调用rand函数生成的伪随机数序列都是一样的。

srand(unsigned seed)通过参数seed改变系统提供的种子值,从而可以使得每次调用rand函数生成的伪随机数序列不同,从而实现真正意义上的“随机”。

通常可以利用系统时间来改变系统的种子值,即srand(time(NULL)),可以为rand函数提供不同的种子值,进而产生不同的随机数序列。

学数学的小窍门

1、学数学要善于思考,自己想出来的答案远比别人讲出来的答案印象深刻。

2、课前要做好预习,这样上数学课时才能把不会的知识点更好的消化吸收掉。

3、数学公式一定要记熟,并且还要会推导,能举一反三。

4、学好数学最基础的就是把课本知识点及课后习题都掌握好。

5、数学80%的分数来源于基础知识,20%的分数属于难点,所以考120分并不难。

6、数学需要沉下心去做,浮躁的人很难学好数学,踏踏实实做题才是硬道理。

stdlibh头文件中有宏#define RAND_MAX 0x7fff

rand()产生一个0到0x7ffff即0到32767之间的随机数

rand()/(RAND_MAX+10)就等于一个0到1之间的小数了,因为rand()最大是32767最小是0,再除以32768就是一个0到1之间的小数(不能等于1),再乘以10就是一个0到10之间的数了(不等于10)最后再加1,就成了一个求1到10之间随机数的式子了

srand函数是随机数发生器的初始化函数,原型:

void srand(unsigned seed);

它需要提供一个种子,如:

srand(1);

直接使用1来初始化种子。

不过常常使用系统时间来初始化,即使用

time函数来获得系统时间,它的返回值为从 00:00:00 GMT, January 1, 1970

到现在所持续的秒数,然后将time_t型数据转化为(unsigned)型在传给srand函数,即:

srand((unsigned) time(&t));

还有一个经常用法,不需要定义time_t型t变量,即:

srand((unsigned) time(NULL));

直接传入一个空指针,因为你的程序中往往并不需要经过参数获得的t数据。

srand((int)getpid());

使用程序的ID(getpid())来作为初始化种子,在同一个程序中这个种子是固定的

随机输出十个0-100之间的整数

#include <stdlibh>

#include <stdioh>

#include <timeh>

void main( void )

{

int i,k;

srand( (unsigned)time( NULL ) );

for( i = 0; i < 10;i++ )

{

k=rand()%100;

printf( " k=%d\n", k );

}

}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12182028.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存