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++中随机数生成问题总结:rand()与random库 -> 正文阅读

[C++知识库]C++中随机数生成问题总结:rand()与random库

?1、?C?库函数?rand()

在 C++ 程序中,在新标准出现之前,C 和 C++ 都依赖一个简单的 C?库函数?rand?来生成随机数

这个函数生成的是均匀分布的伪随机数,每个随机数的范围在 0 和一个系统相关的最大值(至少为 32767)之间。

rand()函数

int rand(void);

?返回一个 0 ~ RAND_MAX 之间的整数。RAND_MAX 是一个定义在 <cstdlib> 的常数。?

该函数返回的数字实际上是用算法生成的,实际上并不是随机的。它是根据种子生成的,根据不同的种子产生不同的随机序列。系统默认的种子是1,所以说每次使用的随机序列都是固定的。

所以需要配合随机种子生成函数来使用?——

要想使每次运行时变量 x 的值都不同,就必须使它的种子随机,这时就需要用到srand函数。

srand()函数?

void srand(unsigned int seed);

用来设置rand()函数的种子的。根据不同的输入参数可以产生不同的种子。通常使用time函数作为srand函数的输入参数。

time函数会返回1970年1月1日至今所经历的时间(以秒为单位)。

在使用 rand() 函数之前,srand() 函数要先被调用,并且在整个程序中只需被调用一次

具体使用示例:

#include <cstdlib>
#include <ctime>
using namespace std;
int main() 
{
    srand(time(nullptr)); // 用当前时间作为种子
    int min = 5, max = 10;
    int randomValue = (rand() % (max - min)) + min;//范围[min,max)
    randomValue = (rand() % (max - min + 1)) + min;//范围[min,max]
    randomValue = (rand() % (max - min)) + min + 1;//范围(min,max]
}

缺点:

1、不能产生随机浮点数

2、均匀分布:有很多程序需要不通范围的随机数。一些程序需要非均匀分布的随机数。而在编写程序为了解决这些通常会转换?rand?生成的随机数的范围、类型或者是分布时,常常会引入非随机性。

3、随机数:多次循环产生的随机数序列是完全一样的

如:

#include<iostream>
#include<ctime>
using namespace std;
int main() {

    for (int j = 0; j < 5; j++) {
        srand(time(0));  //产生不同的随机数种子 
        for (int i = 0; i < 10; i++)
            cout << rand() % 10 << " "; //rand函数 ;
        cout << endl;
    }
}

运行结果:

??

但是,如果将程序修改如下就不会出现这样的重复序列

#include<iostream>
#include<ctime>
using namespace std;
int main() {
    srand(time(0));  //产生不同的随机数种子 

    for (int j = 0; j < 5; j++) {
        //srand(time(0));  //产生不同的随机数种子 
        for (int i = 0; i < 10; i++)
            cout << rand() % 10 << " "; //rand函数 ;
        cout << endl;
    }
}

?运行结果:

??

一种特性应用场景:

结合 rand() 函数的均匀分布以及有限范围的特点,可以在遗传算法的实现中实现“随机性”的要求

double p = (rand()/RAND_MAX)*Len;//将随机数均匀投射到[0,Len]的区间范围内
if(p<X){
    //情况1
}
else //……


?详见我之前关于遗传算法实现的文章:
GA遗传算法实现记录_努力的耿耿的博客-CSDN博客

2、C++11random库

头文件?random

运用示例代码:

#include<random>//头文件
#include<iostream>
#include<ctime>
using namespace std;
 
int main()
{
	default_random_engine e(time(0));//引擎生成随机序列,设置种子
	uniform_real_distribution<double> u(-1.2,3.5);//设置产生的随机数的类型以及范围
	for(int i = 0; i < 10; ++i)
		cout << u(e) << endl;
	return 0;
}

详细原理见这篇博客:
?【C++】c++ 11中的随机数 ——random_S大幕的博客-CSDN博客_c++11 随机数

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-22 20:20:07  更:2022-03-22 20:22:06 
 
开发: 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 1:47:51-

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