目录
rand()函数是用于生成随机数的函数,用时常和srand()函数一起,两者都包含在stdlib.c头文件里。
rand()的实质
该函数其实是一个伪随机数生成器,开始于一个相同的种子,通过乱七八糟公式生成新数,作为新的种子。我们大概模拟一下rand函数,假设初始的种子是0。
#include<stdio.h>
static unsigned long int next = 1;//种子
unsigned int rand)()
{
next=next*1103515245+12345;//生成伪随机数的魔术公式
return(unsigned int)(next/65536)%32768;
}
其实每次运行结果是一样的,随机数也不随机嘛,真是徒有虚名。
引入srand()
既然是因为每次开始于相同的种子导致生成的随机数不随机,不如我们让每次的种子不同就好了。
srand()函数用于初始化种子,他的参数是一个unsigned的种子。
如果我们传入不同的数字,那么srand()会让rand()每一次的种子都不一样。
如果我们没有使用srand(),初始种子就是不变的1。
所以我们需要一个变化的量传给srand()。
即重置种子:
time()函数返回系统的时间,这是一个随时间变化的量而且可以用于运算。不过其返回值类型是time_c类型,我们需要(unsigned int)强制转换类型,然后才能给srand()用。
time这个函数在time.h头文件里,接受的参数是一个time_c类型对象的地址,不过我们不需要那么麻烦,传入空指针(0或者NULL)作为参数,利用返回值就够了。
生成指定范围内的随机数
利用取余数控制数值范围。
- 随机数求模N,获得 0 ~ N-1 的整数。 rand()%N
- 求模+1,获得1~N的整数。 rand()%N+1
程序演示
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
#define RANGENUM 100//控制随机数的范围为0-100
main()
{
int nRandNum;
srand((unsigned int)time(NULL)); //重置种子
for(int i = 0;i<=10;i++) //产生10个随机数
{
nRandNum=rand()%RANGENUM;//生成随机数,并利用取余数控制数值范围
printf("The %dth random num is: %d\n",i,nRandNum);
}
return 0;
}
应用:给幼稚园小朋友出题
我们小朋友不会太难的题,所以是十以内的加减乘除,除法也是整除,不过假设我的小朋友们比较聪明,知道负数好啦~~
- 生成两个随机数;
- 生成一个随机符号;(这里我们用随机的数字对应随机的符号)
- 输出两个随机数的算式;
- 获得用户输入的算式答案;
#include<stdio.h> #include<time.h> #include<stdlib.h>//提供rand()原型 #include<string.h> //生成两个10以内的随机数,及一个随机生成+,-,*,/ 一个运算符号,给用户显示算式,并让用户输入结果,比较结果是否正确 int GiveQuestion(); int continuation(); void Judge(char nsign,int rightanswer,int answer); int Calculate(char c,int x,int y); int Whole=0; int correct=0; int main() { printf("来做加减乘除运算题叭~\n"); int right=GiveQuestion(); printf("这次总共做了%d道题,你一共做对了%d道题~你真棒!!!\n下次再见~~",Whole,right); } int GiveQuestion() { int num1,num2,answer; char sign[4]={'+','-','*','/'}; srand((unsigned int)time(NULL)); do { char nsign=sign[rand()%3+1]; num1=rand()%10; num2=rand()%10; Whole++; while(nsign=='/'&&num1%num2!=0) { num1=rand()%10; num2=rand()%10; } printf("%d %c %d = ? ",num1,nsign,num2); scanf("%d",&answer); int flag=0; Judge(nsign,Calculate(nsign,num1,num2),answer);//调用判断正误的函数 }while(continuation()); return correct; } int Calculate(char c,int x,int y) { if(c=='+') return(x+y); if(c=='-') return(x-y); if(c=='*') return(x*y); if(c=='/') return(x/y); } void Judge(char nsign,int rightanswer,int answer) { int flag=0; if(rightanswer==answer) { printf("你太聪明啦~~~\n"); correct++; } else printf("太可惜了,不对哟~\n"); } int continuation() { printf("你想要继续游戏吗?按1则游戏继续,否则游戏结束。\n"); int sign; scanf("%d",&sign); if(sign==1) return 1; else return 0; }
分享就结束啦,感谢阅读!!!!阿里嘎多!!!
2021.11.27
SThree楠钰子.

被折叠的 条评论
为什么被折叠?



