菜鸟初学C学习记录——从骰子问题了解生成随机数

引子:骰子问题

假如需要用代码在电脑中实现一个骰子并输出点数。

这时就需要我们想方法生成随机数并把随机数范围控制在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;
}

  • 24
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值