生成随机数 ~详细解析

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 生成随机数 ~详细解析

如何生成1~100随机数

最近在写一个如何生成随机数的练习:生成一个1~100的随机数,通过百度我发现到是要调用sand函数来实现的,接下来我们慢慢深入了解吧!

得知我们生成随机数要用到sand函数,但我们并不知道这个函数究竟是如何运行的,接下来我们可以在MSDN里查看这个函数的用法。

0a2653c851af460fa595bd959398a8f1.png

通过查看后,得知这个函数会返回一个从0到RAND_MAX的随机整数,对此我并不知道它的数值于是多少,于是我们右键点击转到定义。


#define RAND_MAX 0x7fff

发现define定义的 RAND_MAX大小是0x7fff,转换成十进制也就是32767,也就是说这个函数可以返回一个从0~32767的整型。接下来我们实战一下发现

2d65d23f6d4748949b924e4057485923.png

本以为已经可以生成随机数了,可但是当我第二次运行时发现,它生成的还是这些随机数,也就是说,第一次生成的随机数和第二次生成的是相同的。我这细想肯定出错了,回头看在描述中还有第二句话:在调用rand函数之前,我们要调用srand函数设置生成随机数。对此我又在MSDN中查查srand函数:

6de278e6d6694ce5bb08e7e842b7e74b.png

发现srand函数的参数是一个无符号整型并且无返回值,那我们测试一下,随便给srand输入一个无符号整型比如:100。

8ec4f2997fb246878c34ecd6d122b7c6.png

当再一次运行的时候,程序还是照样生成一样的随机数,只有通过我们改变传入srand的参数时,生成的随机数才会改变。

12c3b7f3f8814309a195c64f051d4445.png

那么问题来了,当我们给srand传入一个随机数,那么rand就会给我们返回一个随机数,想到这里不就出问题了吗?!我们为了生成一个随机数,现在要我们输入一个随机数才行,这不就是先有蛋还是先有鸡的问题嘛!

这时候我们想要给srand传进去一个一直在发生变化的值不就OK了吗?那什么是一直发生变化的呢?我们想到咱电脑上一直在发生变化的~~时间。这时候我们要介绍一个概念:时间戳

时间戳:当前时间相较于计算机起始时间的差值,单位是秒。

34e8d716411043c08c7ffba9fbba23de.png

所以我们用时间戳作为随机数的生成器,那么每一个所生成的随机数都是随机的,所以我们可以给srand传一个时间戳,这时候我们就需要用到time函数,C语言提供的time函数,可以返回一个时间戳。


92ba0822ed0b46e1ae72df8a17d3a45b.png


这里我们可以看到time函数的参数是time_t型指针,返回值是time_t型。通过转到定义发现,是整型和长整型类型,其实time函数最终返回的是一个整数。


d79b274929334152a6d38be91e2d1be3.png


如果创建一个time_t t;即可把t的地址传给参数timer,那么函数就把时间戳的时间放在了t里面,当然这个参数我们也可以不用,于是我们就向time函数传入一个空指针( NULL)即可。当然也可以通过返回值把时间戳返回来,所以我们如果要将time函数的返回值传入srand函数,那么我们就需要将time函数的返回值强制性转化会unsigned int型。


0a2653c851af460fa595bd959398a8f1.png


这样就真正的产生随机数了!但是生成的随机数不在1~100的范围里面。

如何生成规定位数的随机数呢:(1~100)


int ret = rand()%100+1;


可知任何一个数字%100余的数字只能取0~99,我们只需要将所得随机数对100取余数,那么我们得到的数就是0-99的数字,这时再加上1便是1-100的数字了。

同理:要生成三位数:


int ret = rand()%1000+1;


以下是猜数字游戏的全部代码


#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
  printf("******1.play*******\n");
  printf("******0.exit*******\n");
  printf("*******************\n");
  printf("*******************\n");
}
void game()
{
  int guess = 0;
  //1.生成一个随机数
  srand((unsigned)time(NULL));
  int ret = rand()%100+1;
  //2.猜数字 
  while (1)
  {
  printf("猜数字:>\n");
     scanf("%d",&guess);
  if (guess < ret)
  {
    printf("猜小了\n");
  }
  else if (guess > ret)
  {
    printf("猜大了\n");
  }
  else
  {
    printf("恭喜你猜对了\n");
    break;
  }
  }
}
int main()
{ 
  int input = 0;
  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;
}


那么到这里就已经讲解完啦,如果文中有错误请指出。


相关文章
|
3月前
|
机器学习/深度学习 算法 安全
随机性、熵与随机数生成器:解析伪随机数生成器(PRNG)和真随机数生成器(TRNG)
随机性在密码学、仿真和机器学习等领域中至关重要,本文探讨了随机性、熵的概念以及伪随机数生成器(PRNG)和真随机数生成器(TRNG)的原理和应用。PRNG通过算法生成看似随机的序列,适用于高效需求;TRNG利用物理过程生成真正随机数,适用于高安全需求。文章还讨论了两者的协同应用及其面临的挑战。
239 5
随机性、熵与随机数生成器:解析伪随机数生成器(PRNG)和真随机数生成器(TRNG)
|
9月前
|
算法 安全 程序员
【C++ 随机数生成器】深入解析C++ 随机数生成器mersenne_twister_engine等
【C++ 随机数生成器】深入解析C++ 随机数生成器mersenne_twister_engine等
357 0
|
JavaScript 前端开发 .NET
|
3月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
131 2
|
4月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
100 1
|
4月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
85 0
|
4月前
|
存储 Java C++
Collection-PriorityQueue源码解析
Collection-PriorityQueue源码解析
86 0
|
2月前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是"将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。创建型模式分为5种:单例模式、工厂方法模式抽象工厂式、原型模式、建造者模式。
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
2月前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
2月前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析

热门文章

最新文章

推荐镜像

更多