引子:骰子问题
假如需要用代码在电脑中实现一个骰子并输出点数。
这时就需要我们想方法生成随机数并把随机数范围控制在1~6的赋值给randNum。所以我们将利用rand()函数和time(NULL)函数生成随机数并控制范围。
一、rand函数是啥???
通过学习我认为rand函数可以简单理解为一个需要包含<stdlib.h>并且可以生成一个0到最大值32767范围随机数的函数。表示为:
rand();//取随机数,范围:0~32767
二、如何利用rand函数成随机数并控制范围咧?。?
通过查阅资料我们可以得到公式:rand()%(m-n+1)+n来表示生成范围是n~m的一个随机数。例如要终实现生成3~7的随机数用的rand()%(7-3+1)+3=rand()%4+3。
如果要解释公式的原理需要把rand()%(m-n+1)+n先分为俩个部分rand()%n和rand()%n+x。
1、rand()%(m-n+1)
通过数学原理可知
假设有正整数x取模x%n的值是在0~(n-1)之的n个数中的一个值而不是1~n的n个数。在理解x%n后就可以更加容易理解
rand()%n 即 0<=rand()%(n-1-0+1)<n(其中有n个数)
所以随机数范围有几个数就取多少的模,就可以确定生成的随机数的范为以模n为例区间为(0,n-1)。例如:rand()%4就是生成随机数的范围就是0~3四个数。
2、rand()%n+x
在rand()%n之后加上整数n可以理解为把随机数的范围区间(0,n-1)向前移动x个单。例如:rand()%4+1就是生成随机数的范围就是1~4四个数。
综上要生成范围(n,m)的随机数的变换为:
0<=rand()%(m-n+1)<=m-n
n<=rand()%(m-n+1)+n<=m
所以得出公式:rand()%(m-n+1)+n
三、rand()配合time(NULL)生成“真”随机数
在理解rand()函数后我们可以得到一下代码
#include<stdio.h>
#include<stdlib.h>
int main(){
int rNm;
rNm=rand();
printf("%d",rNm);
return 0;
}
但是在我们多次运行之后会发现生成的随机数是相同的。这是因为rand函数生成的是伪随机数,每次代码运行所用的随机数种子是相同的。也就是说如果每次调用rand函数时,种子相同,那么根据公式产生的伪随机数将是相同的。如果要想生成真正的随机数就需要保证每次运行rand()函数所调用的随机数种子不同。也就是要利用time(NULL)函数。
1、time(NULL)函数?
使用time函数得到的值是一个时间戳,即从1970年1月1日0点到现在时间的秒数,而time(NULL)函数的值发生变化的最小间隔为1s。也就是每次运行time(NULL)函数的间隔时间要大于1s,否则函数的值是相同的。
2、生成“真”随机数(✌)
在理解time(NULL)函数后我们便让其作用在种子srand上就得到了可以随时间变化的种子表示为:
srand((unsignde int)time(NULL));
把随时间变化的种子与rand()一起服用,就得到了“真”随机数即每次运行都可以得到的值不同且范围在0~32767。代码如下:
#include<stdio.h>
#include<stdlib.h>
int main(){
srand((unsignde int)time(NULL));
int rNm;
rNm=rand();
printf("%d",rNm);
return 0;
}
四、回到骰子问题
利用要用代码在电脑中实现一个骰子并输出点数,也就是生成随机点数randNum1~6输出点数大小。在理解如何生成随机数后利用rand()配合time(NULL)骰子问题也就迎刃而解。得骰子问题代码如下:
#include<stdio.h>
#include<stdlib.h>
int main(){
srand((unsignde int)time(NULL));
int rNm;
rNm=rand()%6+1;
printf("%d",rNm);
return 0;
}