【LINUX相关】生成随机数(srand、/dev/random 和 /dev/urandom )

目录

    • 一、问题背景
    • 二、修改方法
      • 2.1 修改种子
      • 2.2 使用linux中的 /dev/urandom 生成随机数
    • 三、/dev/random 和 /dev/urandom 的原理
      • 3.1 参考连接
      • 3.2 重难点总结
        • 3.2.1 生成随机数的原理
        • 3.2.2 随机数生成器的结构
        • 3.2.3 二者的区别和选择
    • 四、在代码的使用方法

一、问题背景

在一个循环中,生成多组随机值,发现最终的结果都一样,结果是调用的函数如下,在函数中设置了随机种子,且是以秒为单位,那么在一秒类,由于都是用一个种子,srand又是伪随机,所以最终生成的都是同一组随机字符。

static void generate_random_name(char *prefix, char* secName, int size) {char buff[7] = {0};srand(time(NULL));const char ALLOWED[] = "abcdefghijklmnopqrstuvwxyz1234567890";int i = 0;int c = 0;int nbAllowed = sizeof(ALLOWED) - 1;for(i = 0; i < 6; i++) {c = rand() % nbAllowed ;buff[i] = ALLOWED[c];}snprintf(secName, size, "%s_%s", prefix, buff);return;}

二、修改方法

2.1 修改种子

(1)将srand(time(NULL)); 放到循环外面,循环过程中不必每次循序都设置种子;
(2)时间使用微秒来设置种子srand((unsigned int)ts.tv_usec);以避免在短时间内多次调用随机数生成器时生成相同的序列。

2.2 使用linux中的 /dev/urandom 生成随机数

修改后的函数生成方式如下:

static void generate_section_random_name(char *prefix, char* secName, int size) {char buff[7] = {0};char cmd[BUF_LEN_128] = {0};snprintf(cmd, sizeof(cmd), "head /dev/urandom | tr -dc a-z0-9 | head -c %d", sizeof(buff) - 1);do_cmd_fetch(cmd, buff, sizeof(buff));if (buff[0]) {snprintf(secName, size, "%s_%s", prefix, buff);}return;
}

三、/dev/random 和 /dev/urandom 的原理

3.1 参考连接

/dev/random 和 /dev/urandom 的原理
关于 /dev/urandom 的流言终结
关于 /dev/urandom 的流言终结的原文
使用/dev/urandom生成固定位数的随机数

3.2 重难点总结

3.2.1 生成随机数的原理

随机数生成器会收集系统环境中各种数据,比如:鼠标的移动,键盘的输入, 终端的连接以及断开,音视频的播放,系统中断,内存 CPU 的使用等等;
生成器把收集到的各种环境数据放入一个池子 ( 熵池 ) 中,然后将这些数据进行去偏、漂白,主要目的也是使得数据更加无序,更加难以猜测或者预料得到;
有了大量的环境数据之后,每次获取随机数时,从池子中读取指定的字节序列,这些字节序列就是生成器生成的随机数.

3.2.2 随机数生成器的结构

Linux 4.8 之前
在这里插入图片描述
Linux 4.8 以后
在这里插入图片描述
简化图
在这里插入图片描述

3.2.3 二者的区别和选择

具体的可以看我上述分享的两篇文章。
别问,问就是用 /dev/urandom !

四、在代码的使用方法

首先/dev/urandom 设备生成的随机字节流通常是不经过编码的原始字节,因此直接将其打印到终端可能会显示为乱码。这是因为终端尝试使用默认的字符编码(通常是 UTF-8)来解释这些字节,但这些字节可能不是有效的 UTF-8 字符。

在这里插入图片描述
所以需要做一些转化,比如

1.将随机字节转换为十六进制表示:
head -c 10 /dev/urandom | xxd -p
2.将随机字节转换为可打印字符集合:
head -c 10 /dev/urandom | tr -dc '[:print:]'
3.将随机字节转换为Base64编码(可能更适合在终端中显示):
head -c 10 /dev/urandom | base64

当然也可以使用/dev/urandom生成固定位数的随机数:

1.纯数字
head /dev/urandom | tr -dc 0-9 | head -c n
2.小写字母+数字
head /dev/urandom | tr -dc a-z0-9 | head -c n
3.大小写字母+数字
head /dev/urandom | tr -dc A-Za-z0-9 | head -c n

最后的n代表要生成的随机数的位数

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMq-2安装与配置

Rabbitmq的安装 1.上传资源 注意&#xff1a;rabbitmq的版本必须与erlang编译器的版本适配 2.安装依赖环境 //打开虚拟机 yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c kernel-devel m4 ncurses-devel tk tc xz3.安装erlan…

理解docker命令

基础命令 帮助命令 docker --help&#xff08;帮助命令&#xff09; 用于获取某个命令的帮助信息 #命令帮助 docker 命令 --help 小技巧 换行符 \ 使用命令换符&#xff0c;可以让繁杂命令变得有条理 #命令换行&#xff0c;使用换行符 \ docker ... \... \ 镜像命令 d…

不含数字的webshell绕过

异或操作原理 1.首先我们得了解一下异或操作的原理 在php中&#xff0c;异或操作是两个二进制数相同时&#xff0c;异或(相同)为0&#xff0c;不同为1 举个例子 A的ASCII值是65&#xff0c;对应的二进制值是0100 0001 的ASCII值是96&#xff0c;对应的二进制值是 0110 000…

Android11 中 LED 使用-RK3568

文章目录 前言原理图设备树驱动前言 现在我们来学习点亮LED 原理图 然后对应在核心板原理图上查找 Working_LEDEN_H_GPIO0_B7,如下图所示: 那么我们只要控制 GPIO0_B7 即可控制 led 的亮灭。 设备树 leds: leds {compatible = "gpio-leds";work_led: work {gpi…

6-模板初步使用

官网: 中文版: 介绍-Jinja2中文文档 英文版: Template Designer Documentation — Jinja Documentation (2.11.x) 模板语法 1. 模板渲染 (1) app.py 准备数据 import jsonfrom flask import Flask,render_templateimport settingsapp Flask(__name__) app.config.from_obj…

flutter Android 打包和发布

环境 mac vscode 项目简易打包 打开VScode终端&#xff1a;输入命令flutter build apk即可 可能报错&#xff1a; w: Runtime JAR files in the classpath should have the same version. These files were found in the classpath: 修改android/build.gradle 中版本信息 项…

上海亚商投顾盘:沪指震荡反弹 机器人概念股掀涨停潮

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 三大指数今日震荡反弹&#xff0c;科创50盘中涨超1%。机器人概念股掀涨停潮&#xff0c;通力科技、昊志机电、哈焊…

Java实现将内容写到文件里面

目录 1 实现 1 实现 String appendLog "";File logFile new File(logFileName);// append file contentFileOutputStream fos null;try {fos new FileOutputStream(logFile, true);fos.write(appendLog.getBytes("utf-8"));fos.flush();} catch (Ex…

CentOS ens160 显示disconnected

使用nmcli device查看网卡状态&#xff0c;显示如图&#xff1a; 检查宿主机系统VMware DHCP Sevice和VMware NAT Sevice服务是否正常运行。 右键点击我的电脑管理按钮&#xff0c;打开计算机管理点击服务

【SA8295P 源码分析】62 - Android GVM Kernel 内核 make bootimage 过程分析

【SA8295P 源码分析】62 - Android GVM Kernel 内核 make bootimage 过程分析 一、make bootimage 命令执行过程分析1.1 source buid/envsetup.sh 分析1.2 lunch msmnile_gvmq-userdebug 分析1.3 make bootimage:step 1 之 加载配置文件过程分析1.4 make bootimage:step 2 之…

C++入门篇9---list

list是带头双向循环链表 一、list的相关接口及其功能 1. 构造函数 函数声明功能说明list(size_type n,const value_type& valvalue_type())构造的list中包含n个值为val的元素list()构造空的listlist(const list& x)拷贝构造list(InputIterator first, InputIterator…

[FPGA IP系列] FPGA常用存储资源大全(RAM、ROM、CAM、SRAM、DRAM、FLASH)

本文主要介绍FPGA中常用的RAM、ROM、CAM、SRAM、DRAM、FLASH等资源。 一、RAM RAM(Random Access Memory)是FPGA中最基本和常用的内部存储块&#xff0c;根据不同架构可以实现不同容量&#xff0c;最大可达几十Mb。 FPGA中的RAM主要包括: 分布式RAM&#xff1a;存在于逻辑块…

【仿写tomcat】七、项目结构优化以及代码开源

仿写tomcat 项目结构开源地址 项目结构 到目前为止&#xff0c;博主的仿写tomcat就告一段落了&#xff0c;后续有时间了还会继续补充功能&#xff0c;现在的项目结构如下。 在保证功能的前提下作出的改动有&#xff1a; 将各个类中的参数统一成了Config类&#xff0c;通过对…

17----图表

本节我们来学习markdown的图表。 Markdown 本身并不支持图表&#xff0c;但 Markdown 在技术文章、文档、博客领域使用较多&#xff0c;所以非常多的 Markdown 解析器是支持图表扩展的。在支持图表扩展的 Markdown 解析器中&#xff0c;我们可以使用解析支持的图表语法来渲染图…

shell连接ubuntu

当使用aws的私钥连接时,老是弹出输入私钥密码,但是根本没有设置过密码,随便输入后,又提示该私钥无密码... 很早就使用过aws的ubuntu,这个问题也很早就遇到过,但是每次遇到都要各种找找找...索性这次记下来算了 此处用FinalShell连接为例 首先现在Putty连接工具: 点击官方下载 …

用 VB.net,VBA 两种方式 读取单元格内的 换行数据,并出力到 CSV文件

用 VB.net&#xff0c;VBA 两种方式 读取单元格内的 换行数据&#xff0c;并出力到 CSV文件 需求 如下图所示&#xff0c;为了生成csv文件导入数据库&#xff0c;需要将下图 的 1 和 2 拼接成 如下 3 所示的一行数据&#xff0c; 开头为 1 &#xff0c;往后为 2 的换行数据 将换…

【SA8295P 源码分析】20 - GVM Android Kernel NFS Support 配置

【SA8295P 源码分析】20 - GVM Android Kernel NFS Support 配置 系列文章汇总见:《【SA8295P 源码分析】00 - 系列文章链接汇总》 本文链接:《【SA8295P 源码分析】20 - GVM Android Kernel NFS Support 配置》 # make menuconfigFile systems ---> [*] Network File Sy…

TCP中窗口和滑动窗口的含义以及流量控制

一.窗口 在TCP中由于要保证可靠性&#xff0c;所以每发送一条数据后&#xff0c;都需要接收方返回一条应答报文&#xff0c;要是我们每发送一条数据&#xff0c;发送方就等待接收应答报文&#xff0c;收到之后再去发送下一条数据&#xff0c;这样我们就会花费大量的时间在等待应…

【系统工具】开源服务器监控工具WGCLOUD初体验

经常看到服务器上传下载流量一直在跑&#xff0c;也不知道是啥软件在偷偷联网~~~官网地址&#xff1a;www.wgstart.com&#xff0c;个人使用是免费的。 WGCLOUD官网介绍 "WGCLOUD支持主机各种指标监测&#xff08;cpu使用率&#xff0c;cpu温度&#xff0c;内存使用率&am…