C语言随机数的生成及三个具体案例详解

rand函数

首先,我截取了关于rand函数的文档详解,大家一起跟我看一下。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AYPvycEr-1644457900226)(E:\博客\随机数的生成及猜数字小游戏\随机数的生成及猜数字小游戏.assets\1644333166575.png)]

  1. rand函数的作用:Generates a pseudorandom number.

    翻译过来就是生成伪随机数的意思

    注意:我们所说的伪随机数其实不是真正随机的,计算机目前无法真正实现随机数的生成

  2. 调用rand函数需要引头文件:#include<stdlib.h>

  3. 返回值:rand returns a pseudorandom number

    翻译过来就是 rand返回一个伪随机数

  4. 语法:int ret=rand();

    举例:生成1-100之间的随机数

    int ret=rand()%100+1;
    解释一下:rand()%100代表生成0-99之间的随机数(因为一个数对n取模,得到的值一定在0~n-1之间),在+1就生成了1-100的随机数
    
  5. 注意:The rand function returns a pseudorandom integer in the range 0 to RAND_MAX. Use the [srand]function to seed the pseudorandom-number generator before calling rand.

    翻译过来的意思就是函数返回一个介于0到RAND_MAX之间的伪随机整数。在调用rand之前,使用srand函数来建立伪随机数生成器。

    其中有两点:

    1. rand函数返回一个介于0到RAND_MAX之间的伪随机整数,这个RAND_MAX我们可以通过编译器查询。将RAND_MAX及其头文件编写至VS2019中,点击RAND_MAX,右键->转到定义
      在这里插入图片描述

      我们可以看到#define RAND_MAX 0x7fff这句代码,定义了RAND_MAX为16进制的0x7fff,转换成10进制就是32767,所以随机数的生成范围是0~32767,在int的取值范围内,用int类型的变量接收即可

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-miXV8j8u-1644457900227)(E:\博客\随机数的生成及猜数字小游戏\随机数的生成及猜数字小游戏.assets\1644334126450.png)]

    2. 在调用rand之前,使用srand函数来建立伪随机数生成器。

      我们先不看srand函数具体内容,通过刚才的rand函数使用一下

      #include<stdio.h>
      #include<stdlib.h>
      int main()
      {
          int ret = rand() % 100 + 1;
          printf("ret=%d\n", ret);
      
          return 0;
      }
      
      

      通过这样一个代码,你在短时间内执行多次,发现生成的随机数竟然一样 !

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QMa36wBI-1644457900228)(E:\博客\随机数的生成及猜数字小游戏\随机数的生成及猜数字小游戏.assets\1644334849619.png)]

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YlF2CUyw-1644457900228)(E:\博客\随机数的生成及猜数字小游戏\随机数的生成及猜数字小游戏.assets\1644334865669.png)]

      那么我们实际正确的方法是:使用srand函数,而且我们在帮助文档中也用到了srand函数

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1vvscAvm-1644457900229)(E:\博客\随机数的生成及猜数字小游戏\随机数的生成及猜数字小游戏.assets\1644334971076.png)]

      那么接下来学习一下srand函数


srand函数

这张图片是srand函数的帮助文档,我们大家一起阅读一下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KSXOIBlL-1644457900230)(E:\博客\随机数的生成及猜数字小游戏\随机数的生成及猜数字小游戏.assets\1644335049678.png)]

  1. srand函数的作用:Sets a random starting point.

    译文:设置一个随机的起点。

  2. srand函数需要引头文件:

    #include <stdlib.h>
    #include <time.h>
    
  3. 注意:The srand function sets the starting point for generating a series of pseudorandom integers. To reinitialize the generator, use 1 as the seed argument. Any other value for seed sets the generator to a random starting point. rand retrieves the pseudorandom numbers that are generated. Calling rand before any call to srand generates the same sequence as calling srand with seed passed as 1.

    我从中提取了主要内容:在调用rand函数之前要调用srand函数,设置随机数的生成器,而且不能频繁调用,在主函数调用一回即可。

  4. 用法:调用一次srand( (unsigned)time( NULL ) );

实例一:生成10个随机数(不限制大小)

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

int main()
{
    int i = 0;
    int ret = 0;
    srand((unsigned)time(NULL));//调用一次即可

    for (i = 0; i < 10; i++)
    {
        ret = rand();
        printf("%d\n", ret);
    }

    return 0;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zkh2lRH5-1644457900231)(E:\博客\随机数的生成及猜数字小游戏\随机数的生成及猜数字小游戏.assets\1644335885448.png)]


实例二:生成10个随机数并排序

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

int main()
{
    int a[10] = { 0 };
    int i = 0;
    int ret = 0;
    srand((unsigned)time(NULL));//调用一次即可

    for (i = 0; i < 10; i++)
    {
        a[i] = rand() % 100;
        
    }

    printf("打印前\n");
    for (i = 0; i < 10; i++)
    {
        printf("%d\n", a[i]);
    }

    for (i = 0; i < 9; i++)
    {
        int j = 0;
        for (j = 0; j < 9 - i; j++)
        {
            if (a[j] > a[j + 1])
            {
                int t = a[j];
                a[j] = a[j + 1];
                a[j + 1] = t;
            }
        }
    }
    
    printf("打印后\n");
    for (i = 0; i < 10; i++)
    {
        printf("%d\n", a[i]);
    }

    return 0;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S9hrjl4B-1644457900232)(E:\博客\随机数的生成及猜数字小游戏\随机数的生成及猜数字小游戏.assets\1644336608276.png)]


实例三:猜数字游戏

先上代码:

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

void menu()
{
	printf("***************************\n");
	printf("*****    1. play     ******\n");
	printf("*****    0. exit     ******\n");
	printf("***************************\n");
}


void game()
{
	int guess = 0;
	//猜数字游戏的过程
	//生成随机数
	int r = rand() % 100 + 1;//0~99-->1~100
	//猜数字
	while (1)
	{
		printf("猜数字:>");
		scanf("%d", &guess);
		if (guess < r)
		{
			printf("猜小了\n");
		}
		else if (guess > r)
		{
			printf("猜大了\n");
		}
		else
		{
			printf("恭喜你,猜对了\n");
			break;
		}
	}
}

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));//时间-设置随机数的生成器

	do
	{
		//打印菜单
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}

	} while (input);
	return 0;
}

再上截图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PqskI1oR-1644457900233)(E:\博客\随机数的生成及猜数字小游戏\随机数的生成及猜数字小游戏.assets\1644336752970.png)]

再来讲解:

  1. 首先,我们要在主函数中实现游戏的逻辑:

    1. 选择1:开始游戏
    2. 选择0:退出游戏
    3. 选择其他:输入错误
    int main()
    {
    	int input = 0;//所选择的值
    	srand((unsigned int)time(NULL));//时间-设置随机数的生成器
    
    	do
    	{
    		//打印菜单
    		menu();
    		printf("请选择:>");
    		scanf("%d", &input);
    		switch (input)
    		{
    		case 1:
    			game();
    			break;
    		case 0:
    			printf("退出游戏\n");
    			break;
    		default:
    			printf("选择错误\n");
    			break;
    		}
    
    	} while (input);
    	return 0;
    }
    //通过do while循环至少执行一次的特点,先打印菜单让用户进行选择,利用switch语句,输入1开始游戏,输入0退出游戏,输入其他数字重新开始,而输入0的时候do while循环的判断条件为假退出达到了退出游戏的目的
    
  2. 实现game函数给予玩家提示

    void menu()
    {
    	printf("***************************\n");
    	printf("*****    1. play     ******\n");
    	printf("*****    0. exit     ******\n");
    	printf("***************************\n");
    }
    
  3. 进行游戏部分的实现

    void game()
    {
    	int guess = 0;//玩家所要猜测的值
    	//猜数字游戏的过程
    	//生成随机数
    	int r = rand() % 100 + 1;//0~99-->1~100
    	//猜数字
    	while (1)
    	{
    		printf("猜数字:>");
    		scanf("%d", &guess);
    		if (guess < r)//注意不要写反
    		{
    			printf("猜小了\n");
    		}
    		else if (guess > r)
    		{
    			printf("猜大了\n");
    		}
    		else
    		{
    			printf("恭喜你,猜对了\n");
    			break;//猜对退出即可
    		}
    	}
    }
    

随机数的生成以及三个实例已讲解完毕,希望能给你带来帮助,喜欢请多多支持

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

加勒比海涛

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

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

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

打赏作者

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

抵扣说明:

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

余额充值