IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c++随机数 -> 正文阅读

[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

过程分析:
在这里插入图片描述
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都是取序列首部数据,就是一样的了。
所以说还是不能真正地完全实现随机数的产生。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-13 21:33:09  更:2022-03-13 21:35:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:40:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码