c++随机数

这篇具有很好参考价值的文章主要介绍了c++随机数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

计算机的运行是通过代码来进行的,而代码的执行需要确定的数字,即计算机的运行过程是一个确定的过程,计算机的运行过程是一个确定的过程,所以不可能产生一个真正有意义的数字,即计算机只能产生伪随机数

引用随机数需要引用头文件

#include <cstdlib>

1.随机数函数
(1) c++提供产生随机数的函数:
rand(),原型为:int rand(void);
rand() 产生一个 [0…RAND_MAX] 之间的数字,RAND_MAX是可以产生的最大随机数(2^31-1),是一个常量:

  #define RAND_MAX Ox7FFF

(2) 使用:
生成[0…max-1]之间的随机数:

  rand()%max    //这个表达式会生成[0..max-1]之间的随机数

2.随机数种子
直接使用rand()确实可以产生随机数,但是有一个问题:发现每一次 rand()产生的都是同一个值,不信你试试:

#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
   cout<<rand()<<endl;
    return 0;
}

这就和我们所说的随机数种子有关了。

种子函数:srand(seed);原型为:void srand(unsigned seed);

如果我们在使用 rand()之前 ,如果不写srand(seed),那么就会默认调用 srand(1),这就是问题所在:
rand()看似是产生一个随机数,但是实际上就是rand()在一个固定的数字序列不断取值生成所谓的随机数,而这个数字序列是由srand(seed)产生,数字序列的数字大小和排序由seed确定,只要seed相同,生成的随机数列就是一样的。

比方说,我执行10次rand()

#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
   cout<<rand()<<endl;
   cout<<rand()<<endl;
   cout<<rand()<<endl;
   cout<<rand()<<endl;
   cout<<rand()<<endl;
   cout<<rand()<<endl;
   cout<<rand()<<endl;
   cout<<rand()<<endl;
   cout<<rand()<<endl;
   cout<<rand()<<endl;
    return 0;
}

发现输出结果都是一样的。

41
18467
6334
26500
19169
15724
11478
29358
26962
24464

这就说明在我的电脑里 srand(1)产生的数字序列就是
41
18467
6334
26500
19169
15724
11478
29358
26962
24464
…… ……
当然,不同的电脑可能是不一样的。
当产生一个序列之后,只要不更新队列,每调用一次rand(),rand()就会从上到下依次取值给程序使用,但是若途中调用srand(seed)更新队列,rand()就会从新队列的头再开始依次向下取值。
eg:

#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
   cout<<rand()<<endl;
   cout<<rand()<<endl;
   cout<<rand()<<endl;
   cout<<rand()<<endl;
   cout<<rand()<<endl<<endl;
   srand(1);
   cout<<rand()<<endl;
   cout<<rand()<<endl;
   cout<<rand()<<endl;
   cout<<rand()<<endl;
   cout<<rand()<<endl;
    return 0;
}

输出:

41
18467
6334
26500
19169

41
18467
6334
26500
19169

过程分析:
c++随机数,C++,c++,visual studio,算法
3.产生真正的随机数

根据前面的说明我们知道,需要再让seed动起来才能产生近似随机的伪随机数。
所以我们可以使用系统的时间来做种子,系统的时间是不断变化的,符合我们更菜的要求。
系统的时间获取:time(NULL),单位是s
它的头文件是:

#include <ctime>

eg:

#include <cstdlib>
#include <ctime>
#include <iostream>

using namespace std;
const int maxs=10;

int main()
{
        srand(time(NULL));
      for (int i=0; i<=10; ++i)
    {
        cout<<rand()%maxs<<endl;
    }
    return 0;
}

第一次运行

17717
21613
1852
28959
371
10155
11222
1420
9654
23944
19598

第二次运行

17894
12203
16245
17658
302
25591
15455
7187
16544
19629
11611

发现是不一样的数据。

4.问题
执行如下代码

#include <cstdlib>
#include <ctime>
#include <iostream>

using namespace std;

int main()
{
      for (int i=0; i<=10; ++i)
    {
        srand(time(NULL));
        cout<<rand()<<endl;
    }
    return 0;
}

发现执行结果是一样的数据

18299
18299
18299
18299
18299
18299
18299
18299
18299
18299
18299

这是因为srand(seed)每执行一次就更新一次数字序列,并且将rand()的指向放在序列首部;而程序的运行效率很快,不到1s就执行完循环,seed还没来的及改变,每次产生的数字序列一样,所以每个rand都是取序列首部数据,就是一样的了。
所以说还是不能真正地完全实现随机数的产生。文章来源地址https://www.toymoban.com/news/detail-674015.html

到了这里,关于c++随机数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++随机数生成:std标准库和Qt自带方法

    std::rand() 是C++中的一个随机数函数,它生成一个范围在0到 RAND_MAX 之间的伪随机整数。 在每次程序运行时,通常需要使用不同的种子值来初始化随机数生成器。可以使用 std::srand() 函数来设置种子值。 设置种子的目的是为了引入随机性,使得每次程序运行时生成不同的随机数

    2024年01月16日
    浏览(45)
  • 基于FPGA的LFSR16位伪随机数产生算法实现,可以配置不同的随机数种子和改生成多项式,包含testbench

    目录 1.算法仿真效果 2.算法涉及理论知识概要 3.Verilog核心程序 4.完整算法代码文件 vivado2019.2仿真结果如下:           LFSR(线性反馈移位寄存器)提供了一种在微控制器上快速生成非序列数字列表的简单方法。生成伪随机数只需要右移操作和 XOR 操作。LFSR 完全由其多项式

    2024年02月11日
    浏览(32)
  • 【C++】详解用标准库的std::mt19937生成随机数

    2023年8月16日,周三晚上 写了1个半小时 目录 概述 英文文档 什么是mt19937 什么是状态大小 头文件 std::mt19937的常用成员函数 1. 构造函数: 2. 种子操作函数: 3. 随机数生成函数: 4. 辅助函数: 生成种子值 方法1:使用std::random_device 方法2:使用时间戳 举例说明 英文文档 std:

    2024年01月17日
    浏览(31)
  • Hadoop中的加密解密机制——伪随机数生成算法介绍

    作者:禅与计算机程序设计艺术 Hadoop作为当下最流行的大数据处理平台,提供了丰富的功能支持,如海量数据的存储、分析与计算。其中一个重要的环节就是数据安全问题。无论是存储集群还是计算集群,都需要提供数据保护措施来确保数据的完整性和可用性。今天我将介绍

    2024年02月06日
    浏览(41)
  • C++ 标准库随机数:std::default_random_engine

    库头文件 #include random  

    2024年02月08日
    浏览(38)
  • Opencv C++图像处理:矩阵Mat + 随机数RNG + 计算耗时 + 鼠标事件

    数据类型 字节数 取值范围 bool型(布尔型) 1 [0 or 1] BOOL型(int型) 4 [TRUE or FALSE] sbyte型(有符号8位整数) 1 [128 ~ 127] bytet型(无符号8位整数) 8U 2 [0 ~ 255] short型(有符号16位整数) 16S 2 [-32,768 ~ 32,767] ushort型(无符号16位整数) 16U 2 [0 ~ 65,535] int型(有符号32位整数) 32S 4 [

    2024年02月03日
    浏览(38)
  • C# 随机数生成 Mersenne Twister 马特赛特旋转演算法 梅森旋转算法

    NuGet安装MathNet.Numerics 引用: using MathNet.Numerics.Random; Mersenne Twister算法是一种伪随机数发生器,名字来源于其周期长度通常取自Mersenne质数。它是由Makoto Matsumoto(松本)和Takuji Nishimura(西村)于1997年开发的,基于有限二进制字段上的矩阵线性再生。它的主要作用是生成伪随机数

    2024年02月09日
    浏览(28)
  • iOS MT19937随机数生成,结合AES-CBC加密算法实现。

    按处理顺序说明: 1. 生成随机数序列字符串函数 生成方法MT19937,初始种子seed,利用C++库方法,生成: 2. 对第一部中的随机数序列字符串进行sha256加密,得到64字节的一个数据流函数。  3. AES-CBC加密解密方法 /*     CCCrypt方法提供了CBC 和 ECB 两种AES加密模式,     如果不传

    2024年04月09日
    浏览(39)
  • 【Python】蒙特卡洛模拟 | PRNG 伪随机数发生器 | 马特赛特旋转算法 | LCG 线性同余算法 | Python Random 模块

          猛戳订阅!  👉 《一起玩蛇》🐍 💭 写在前面: 本篇博客将介绍经典的伪随机数生成算法,我们将  重点讲解 LCG(线性同余发生器) 算法与马特赛特旋转算法,在此基础上顺带介绍 Python 的 random 模块。   本篇博客还带有练习,无聊到喷水的练习,咳咳…… 学完前

    2024年02月04日
    浏览(38)
  • JS - 生成随机数的方法汇总(不同范围、类型的随机数)

    (1)使用 random() 方法可以返回一个介于 0 ~ 1 之间的伪随机数(包括 0,不包括 1)。 (2)下面是一个测试样例 (1)这种最简单,因为和 random 的特点保持一致。只需使用如下公式即可: (2)比如下面生成 [10,15) 范围内的随机浮点数。 因为 random 的特点,要取得这几个区间

    2023年04月08日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包