随机数函数有多随机呢~给幼稚园小朋友出计算题~~

目录

rand()的实质

引入srand()

生成指定范围内的随机数

程序演示

应用:给幼稚园小朋友出题


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)作为参数,利用返回值就够了。

生成指定范围内的随机数

        利用取余数控制数值范围。

  1. 随机数求模N,获得 0 ~ N-1 的整数。                rand()%N
  2. 求模+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;
 
}

应用:给幼稚园小朋友出题

我们小朋友不会太难的题,所以是十以内的加减乘除,除法也是整除,不过假设我的小朋友们比较聪明,知道负数好啦~~

  1. 生成两个随机数;
  2. 生成一个随机符号;(这里我们用随机的数字对应随机的符号)
  3. 输出两个随机数的算式;
  4. 获得用户输入的算式答案;
    #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楠钰子.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序和三三总有一个能跑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值