看一次就懂的 rand()函数

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/*


rand() 函数是一种不需要参数,它会返回一个从0到RAND_MAX(rand()函数返回的最大值,不要急嘛,下面详细会讲到的啦)
的任意整数,最大值的大小通常是固定的一个大整数。


用法如下:


int main()
{


  printf ("%d",rand());


  return 0;
}
如果你多次点击创建的话,你会发现rand()的结果是不变的,咦!奇怪了?rand()函数不是返回一个随机数吗?按理说每次返回的
情况应该是不同的啊(理想情况下),到我这为什么不行了呢!哼!别急嘛,不是还我的吗!!


我们知道rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数(就是同过固定公式计算得来的),
是根据一个数,我们可以称它为种了,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,
从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统(相信你可能
有点明白了。。有点。。先向下看吧)


为了改变这个种子的值,C提供了 srand()函数,它的原形是void srand( int a) 功能是初始化随机产生器既rand()函数的初始值,
即使把种子的值改成a; 看代码!!对了,还有一个问题,对于初始值a,显然我们是不能每产生一次随机数,就手动输入一次a吧,
(这是一个好的程序员的基本素养!!)所以我们可应用我们计算机本地的时间作为a啊!(电脑右下角的时间可是自己动的奥)
我们需要一个 time()函数,当然还有它的头文件 #include<time.h> 具体用法如下
*/
int main()
{
    srand((int)time(0));//可以看成固定用法
    printf ("%d",rand());
    return 0;
}


这次你会惊奇的发现,每一次创建之后的rand()函数结果终于不一样了!


其实呢 因为rand的内部实现是用线性同余法(如果不懂你可以去网上查查)做的,他不是真的随机数,只不过是因为
其周期特别长,所以有一定的范围里可看成是随机的,rand()会返回一随机数值,范围在0至RAND_MAX 间。
在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。rand ()产生的是
假随机数字,每次执行时是相同的。若要不同,以不同的值来初始化它.初始化的函数就是srand()。




然后我们再来讲讲 RAND_MAX 它不是我们现编的一个变量,人家可是C本来就有的。
RAND_MAX 的最小值是32767(int),即双字节(16位数)。
若用unsigned int 双字节是 65535,四字节是 4294967295 的整数范围。


我们再来说说如何得到你想要的某个范围的随机数(瞪大眼睛!)






模除+加法”的方法


因为,对于任意数,0<=rand()%(n-m+1)<=n-m


因此,0+m<=rand()%(n-m+1)+m<=n-m+m


因此,如要产生[m,n]范围内的随机数num,可用:


int num=rand()%(n-m+1)+m;


其中的rand()%(n-m+1)+m算是一个公式,记录一下方便以后查阅。


比如产生50~100的随机整数:


srand(time(0));


int a = rand() % (51)+50;


如果想要分数呢?


若要产生0~1之间的小数,则可以先取得0~10的整数,然后均除以10即可得到“随机到十分位”的10个随机小数。

猜你喜欢

转载自blog.csdn.net/qq_41199502/article/details/80726780
今日推荐