c++随机数生成进阶random与随之种子生成器的使用

随机数的作用我就不说了,但凡要用随机数的童鞋一定是有这个需求。下面我们就分三个层次来介绍随机数生成。

文章目录

  • 一、利用rand函数生成随机数
    • 1、rand裸奔
    • 2、随机数种子srand-随机数生成器
    • 3、如何得到不同的种子值
      • (1)、利用系统时间戳time()函数
      • (2)、通过循环自己传入种子值
      • (3)、多次随机作为种子值
  • 二、利用rand类来生成随机数
    • 1、介绍random类的使用
    • 2、做一个随机生成姓名和成绩但的实例

文章随时可能更新,请关注文章原出处:https://blog.csdn.net/haigear/article/details/136032962

一、利用rand函数生成随机数

rand函数是c++自带的函数,它的有点是不需要另外包涵其他的类就可以直接使用。但第一次使用它的同学可能会感到失望。

1、rand裸奔

第一次使用rand失望的同学一定是一上来就用一个rand来裸奔,这样每次运行的结果都一模一样,根本达不到随机的目的,如下面的程序:

#include <iostream>
using namespace std;

int main() {
   cout<< rand();
    return 0;
}

上面的程序得到的随机数都是一样,是因为我们没有设置一个变化的随机种子random seeds。

2、随机数种子srand-随机数生成器

是不是我们设置了随机种子就可以呢?看看下面的代码:

#include <iostream>
using namespace std;

int main() {
   srand(1000); ///
   cout<< rand();
    return 0;
}

实际上,我们得到的结果还是一样,每次的随机数都一样。为什么呢?

srand()函数的作用是用以设置随机数生成器的种子。随机数生成器通常基于一个算法,根据一个种子值来生成伪随机数序列。如果不设置种子值,每次程序运行时生成的随机数序列都是相同的。

通过调用srand()函数并传入一个种子值,可以改变随机数生成器的种子,从而使得每次程序运行时生成的随机数序列都不同。通常情况下,可以使用当前时间作为种子值,以确保每次生成的随机数序列都是不同的。

3、如何得到不同的种子值

一般来说有几种办法,一种是利用系统时间戳作为种子值,或者自己在循环中传入不同的种子值,下面我们看看这两种典型的随机数生成代码:

(1)、利用系统时间戳time()函数

srand(time(0));

for(int i=0;i<=100;i++){
	//TODO
	// srand(100000*i);
	  cout<< rand()%20<<endl; //20以内的随机数
}

(2)、通过循环自己传入种子值

for(int i=0;i<=100;i++){
	//TODO
	 srand(100000*i);
	  cout<< rand()%20<<endl;//20以内的随机数
} 

(3)、多次随机作为种子值

srand(time(0));
int frd;
for(int i=0;i<=10;i++){
	//TODO
	  frd= rand()%19999;
	  cout<<frd<<":";
	  srand(frd);
	  cout<<rand()%60<<endl;
}

输出结果:
在这里插入图片描述

除此之外,我们如果有条件可以使用外界传感器获取的数据作为种子值。如果熟悉系统或者网络编程的,也可以利用网络瞬时的收发包数量或者CPU、gpu的利用率、硬盘的读写数据量作为种子,只是稍显麻烦。

二、利用rand类来生成随机数

1、介绍random类的使用

其实c++的类库中自带了一个rand的类,使用它,我们会更方便避免随机种子值的设置不当导致的每次取得的随机数都一样的问题。我们来看看代码:

#include <random>
#include <iostream>
using namespace std;

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char** argv) {
		int min=0;
		int max=100;
		random_device rd;
		ranlux24 gen(rd());	
		uniform_int_distribution<> u(min, max);
		for(int i=0;i<=20;i++){
			cout<<u(gen)<<endl;
		}		
	return 0;
}

我们这里就可以得到20个0到100内的随机数
在这里插入图片描述

我们可以看到,这里很容控制指定范围内的随机数,当然,我们也使用了好几个我们不得了解的几个random类中的几个对象:
random_device:是使用硬件熵源的非确定随机数生成器对象
uniform_int_distribution:随机分布对象,类似的还有伯松分布,正态分布,柯西分布,科舍尔分布等,这个可以根据自己的需要选择,要参看官方文档。
ranlux24:是一种预定义生成器
具体要了解random类中的这些对象我们可以参考这里点击进入
文章随时可能更新,请关注文章原出处:https://blog.csdn.net/haigear/article/details/136032962
可以这么说,用好了这个类,我们想要的真随机数就可以实现。

2、做一个随机生成姓名和成绩但的实例

首先我们来生成一个随机姓名,当然,每一次运行得到的姓名是不同的,代码如下:

#include <iostream>
#include <vector>
#include <random>
using namespace std;

int main() {
    vector<string> surnames = {"史", "廖", "胡", "邢", "赵"};
    vector<string> names = {"丽", "耀金", "德远", "珍香", "德恒"};

    random_device rd;
    mt19937 gen(rd());
    uniform_int_distribution<> surname_dist(0, surnames.size() - 1);
    uniform_int_distribution<> name_dist(0, names.size() - 1);

    string surname = surnames[surname_dist(gen)];
    string name = names[name_dist(gen)];

    cout << "Random name: " << surname << name << endl;
    return 0;
    }

基于上面的方法,我们可以增加随机生成50个姓名及其成绩但的案例,以供我们的数据库学习的测试数据:

#include <iostream>
#include <vector>
#include <random>
using namespace std;

int main() {
    const int num_students = 50;
    const int num_subjects = 5;

    vector<string> surnames = {"史", "廖", "胡", "邢", "赵","刘","钱","秦","朱","马","罗","瞿","余","郝","邵"};
	vector<string> names = {"丽", "耀金", "德远", "珍香", "德恒","海洋","依琪","尚殊","阳","雨","梓辰","柯","骥","宇衡","清清","勇","玫玲","雨欣","思琪","可欣","雨柔","新宇","明鑫","鸣志","顾昀","扬名","世平","志伟"};
	    
    vector<vector<int>> grades(num_students, vector<int>(num_subjects));
    random_device rd;
    mt19937 gen(rd());
    uniform_int_distribution<> grade_dist(0, 100);
    uniform_int_distribution<> surname_dist(0, surnames.size() - 1);
    uniform_int_distribution<> name_dist(0, names.size() - 1);

    // 随机生成50个同学的姓名和5个学科成绩
    // 输出成绩总表
    cout << "Grades table:" << endl;
    for (int i = 0; i < num_students; i++) {
    	
    	string surname = surnames[surname_dist(gen)];
		        string name = names[name_dist(gen)];
		        cout <<surname << name << ":";
        //cout << "Student " << i+1 << ": ";
        
        
        for (int j = 0; j < num_subjects; j++) {
        	 grades[i][j] = grade_dist(gen);
           cout << grades[i][j] << " ";
        }
        cout << endl;
    }

    return 0;
}

输出的成绩单效果如下,当然,你也可以用filestream对象写入文件,这个很简单,你自己动手完善吧:
在这里插入图片描述
文章随时可能更新,请关注文章原出处:https://blog.csdn.net/haigear/article/details/136032962

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/379885.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

文件上传-Webshell

Webshell简介 webshell就是以aspphpjsp或者cgi等网页文件形式存在的一种命令执行环境&#xff0c;也可以将其称做为一种网页木马后门。 攻击者可通过这种网页后门获得网站服务器操作权限&#xff0c;控制网站服务器以进行上传下载文件、查看数据库、执行命令等… 什么是木马 …

2024.02.08

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this);this->setWindowIcon(QIcon(":/zh.png"));ui->lineEdit->setPlaceholderText("账号/手…

【Linux笔记】缓冲区的概念到标准库的模拟实现

一、缓冲区 “缓冲区”这个概念相信大家或多或少都听说过&#xff0c;大家其实在C语言阶段就已经接触到“缓冲区”这个东西&#xff0c;但是相信大家在C语言阶段并没有真正弄懂缓冲区到底是个什么东西&#xff0c;也相信大家在C语言阶段也因为缓冲区的问题写出过各种bug。 其…

再识C语言 DAY16【进制的转换 】

文章目录 前言进制的转换一、各个进制的组成二、二进制转换其他进制三。其他进制转换为二进制四.小数部分进制转换五.八进制与十进制的相互转换 总如果您发现文章有错误请与我留言&#xff0c;感谢 前言 本文章总结于此视频 进制的转换 一、各个进制的组成 1. 二进制&#x…

【C语言自定义类型详解进阶】结构体(补充结构体的对齐和位段,一口气看完系列,央妈都点赞的博文)

目录 1.结构体 1.1 结构的基础知识 1.2 结构的声明 1.2.1特殊的声明&#xff08;匿名结构体类型&#xff09; 1.3结构体变量的定义 1.4关于匿名结构体类型的补充 1.5结构体的自引用 1.6结构体变量的初始化 2.结构体内存对齐&#xff08;重点&#xff09; 2.1偏移量补…

报错ValueError: Unknown CUDA arch (8.6) or GPU not supported

文章目录 问题描述解决方案参考文献 问题描述 报错 ValueError: Unknown CUDA arch (8.6) or GPU not supported 本人显卡为 RTX 3060&#xff0c;CUDA 为 10.2&#xff0c;PyTorch 为 1.5 解决方案 修改 C:\Users\Administrator\Envs\test\Lib\site-packages\torch\utils\c…

nvm安装nodejs 报错certificate has expired or is not yet valid

今天在使用nvm安装nodejs时&#xff0c;突然报如下错误&#xff1a; 从报错信息中很容易知道这是因为镜像凭证过期&#xff0c;所以我们只需要换个镜像即可。 打开你nvm的安装目录下的settings.txt文件&#xff0c;将下面两行添加到里面&#xff0c;如果已经有的就覆盖。 nod…

【制作100个unity游戏之24】unity制作一个3D动物AI生态系统游戏3(附项目源码)

最终效果 文章目录 最终效果系列目录前言随着地面法线旋转在地形上随机生成动物不同部位颜色不同最终效果源码完结系列目录 前言 欢迎来到【制作100个Unity游戏】系列!本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第24篇中,我们将探索如何用unity制作一…

一周学会Django5 Python Web开发-Django5创建项目(用命令方式)

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计11条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

前端滚动组件分享

分享一个前端可视化常用的卡片列表滚动组件&#xff0c;常用于可视化项目左右两侧的卡片列表的滚动。效果如下图所示&#xff1a; 组件描述 当鼠标移入滚动区域时&#xff0c;滚动行为停止当鼠标再次离开时&#xff0c;滚动继续 源码展示 <template><div ref"…

停车场|基于Springboot的停车场管理系统设计与实现(源码+数据库+文档)

停车场管理系统目录 目录 基于Springboot的停车场管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员功能实现 &#xff08;1&#xff09;车位管理 &#xff08;2&#xff09;车位预订管理 &#xff08;3&#xff09;公告管理 &#xff08;4&#…

Zoho Mail企业邮箱商业扩展第2部分:企业运营

在关于Zoho Mail企业邮箱商业扩展应用的这个系列的第一部分中&#xff0c;我们遇到了一位名叫王雪琳的个体企业家。她经营着自己的营销机构&#xff0c;并展示了如何创建和管理自己的企业。为了提升企业的专业形象&#xff0c;王雪琳使用了Zoho Mail来建立个性化的电子邮件域名…

【Linux】线程

线程 我们常常会在linux中或者在操作系统这门课中听到进程和线程的名称&#xff0c;我们之前认识了进程的概念&#xff0c;现在我们来了解一下线程的概念 线程概念&#xff1a; 什么是线程 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的定…

牛客网SQL264:查询每个日期新用户的次日留存率

官网链接&#xff1a; 牛客每个人最近的登录日期(五)_牛客题霸_牛客网牛客每天有很多人登录&#xff0c;请你统计一下牛客每个日期新用户的次日留存率。 有一个登录(login。题目来自【牛客题霸】https://www.nowcoder.com/practice/ea0c56cd700344b590182aad03cc61b8?tpId82 …

第三百一十五回

文章目录 1. 概念介绍2. 基本用法3. 补充用法4. 内容总结 我们在上一章回中介绍了"再谈ListView中的分隔线"&#xff0c;本章回中将介绍showMenu的用法.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在第一百六十三回中介绍了showMenu相关的内容…

C++学习Day04之单例模式

目录 一、程序及输出1.1 饿汉式实例1.2 饿汉式单例1.3 懒汉式单例1.4 线程安全的懒汉式单例 二、分析与总结 一、程序及输出 1.1 饿汉式实例 #include<iostream> using namespace std; #include <string> class Printer { public:static Printer * getInstance()…

《向量数据库指南》——Milvus Cloud「日志」问题定位的指南针

“2.X 集群的日志在哪里导啊”“现在没有对 Milvus Cloud 进行任何读写操作,但是日志还是不断增加,这正常吗?”“请教下 k8s 部署的 Milvus Cloud 日志如果持久化,只能使用共享存储吗?如果只想放在本地盘可以如何配置?” 社区讨论问题的时候基本都离不开日志,因为日志…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Span组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Span组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Span组件 鸿蒙&#xff08;HarmonyOS&#xff09;作为Text组件的子组件&#xff0…

探索Xposed框架:个性定制你的Android体验

探索Xposed框架&#xff1a;个性定制你的Android体验 1. 引言 在当今移动设备市场中&#xff0c;Android系统作为最受欢迎的操作系统之一&#xff0c;其开放性和可定制性备受用户青睐。用户希望能够根据个人喜好和需求对其设备进行定制&#xff0c;以获得更符合自己习惯的使用…

架构整洁之道-软件架构-展示器和谦卑对象、不完全边界、层次与边界、Main组件、服务

6 软件架构 6.9 展示器和谦卑对象 在《架构整洁之道-软件架构-策略与层次、业务逻辑、尖叫的软件架构、整洁架构》有我们提到了展示器&#xff08;presenter&#xff09;&#xff0c;展示器实际上是采用谦卑对象&#xff08;humble object&#xff09;模式的一种形式&#xff…