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

news2024/10/5 17:20:14

目录

    • 一、问题背景
    • 二、修改方法
      • 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.coloradmin.cn/o/886074.html

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

相关文章

2023一建各科考点归纳

一级建造师《建设工程项目管理》高频考点 1Z201000建设工程项目的组织与管理 1Z201010建设工程管理的内涵和任务 系统的目标决定了系统的组织&#xff0c;而组织是目标能否实现的决定性因素。 建设工程管理涉及工程项目全过程&#xff0c;包括: 决策阶段-开发管理: 实施阶…

《零基础7天入门Arduino物联网-01》学前必看

配套视频课程&#xff1a;《零基础学Arduino物联网&#xff0c;入门到进阶》 配套课件资料获取&#xff1a;微联实验室 配套学习套件购买&#xff1a;淘宝搜索店铺【微联实验室】 学前须知 注意事项 本系列课程主要针对零基础的物联网爱好者群体开发&#xff0c;非系统性讲解…

Java 中操作 Redis

文章目录 一、Redis 常用数据类型二、Redis 常用操作命令1. 字符串命令2. 哈希命令3. 列表命令4. 集合命令5. 有序集合命令6. 通用命令 三、在 Java 中操作 Redis1. 导入 maven 坐标2. 配置 Redis 数据源3. 编写配置类 四、在代码中的具体使用 一、Redis 常用数据类型 Redis 存…

6.4 恶意代码

数据参考&#xff1a;CISP官方 目录 恶意代码概念及发展历程恶意代码的传播方式恶意代码防护 一、恶意代码概念及发展历程 1、什么是恶意代码 什么是恶意代码 《中华人民共和国计算机信息系统安全保护条例》第二十八条&#xff1a;“计算机病毒&#xff0c;是指编制或者…

VMware虚拟机下载与安装

VMware虚拟机下载与安装 目录 VMware虚拟机下载与安装[TOC](目录) 概述 1. 下载虚拟机1.1 访问官网1.2 点击产品菜单&#xff0c;然后选择产品 VMware Workstation Pro1.3 选择试用版下载 2.安装虚拟机2.1 右键点击安装包&#xff0c;选择以管理员身份运行2.2 按照说明进行安装…

玩转VS code 之 C/C++ 环境配置篇

PS&#xff1a;俺是菜鸟&#xff0c;整理和踩坑试错花了不少时间&#xff0c;如果这篇文章对您有用的话&#xff0c;请麻烦您留下免费的赞赞&#xff0c;赠人玫瑰&#xff0c;手留余香&#xff0c;码字踩坑不易&#xff0c;望三连支持 上一篇&#xff1a;玩转 VS code 之下载篇…

数字人如何赋能汽车品牌营销线下实时交互?

为了进一步巩固和拓展消费群体&#xff0c;扩大品牌影响力&#xff0c;别克汽车在线下开展了新品体验日活动&#xff0c;在品鉴会现场数字人影萱作为神秘嘉宾惊喜亮相&#xff0c;与现场嘉宾和众多媒体同屏实时互动&#xff0c;这虚拟与现实的碰撞互动形式&#xff0c;让现场嘉…

复合 类型

字符串和切片 切片 切片的作用是允许你引用集合中部分连续的元素序列&#xff0c;而不是引用整个集合。 例如&#xff1a; let s String::from("hello world");let hello &s[0..5]; // 切片 [0,5) 等效于&s[..5] let world &s[6..11]; // 切片…

Puppeteer vs Selenium的主要区别

Puppeteer vs. Selenium&#xff1a;他们来自哪里&#xff1f; Google Puppeteer是一个 Node.js 库和浏览器测试框架。该技术旨在提供高级应用程序编程接口&#xff0c;以通过 DevTools 协议控制无头 Chrome。Selenium 支持多种浏览器和语言&#xff0c;而 Puppeteer 只专注于 …

Leetcode-每日一题【剑指 Offer 32 - III. 从上到下打印二叉树 III】

题目 请实现一个函数按照之字形顺序打印二叉树&#xff0c;即第一行按照从左到右的顺序打印&#xff0c;第二层按照从右到左的顺序打印&#xff0c;第三行再按照从左到右的顺序打印&#xff0c;其他行以此类推。 例如: 给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20…

清风数学建模——拟合算法

拟合算法 文章目录 拟合算法概念 确定拟合曲线最小二乘法的几何解释求解最小二乘法matlab求解最小二乘法如何评价拟合的好坏计算拟合优度的代码 概念 在前面的篇幅中提到可以使用插值算法&#xff0c;通过给定的样本点推算出一定的曲线从而推算出一些想要的值。但存在一些问题…

设计模式之原型模式详解

前言 在设计模式的系列文章中&#xff0c;我们前面已经写了工厂模式、单列模式、建造者模式&#xff0c;在针对创建型模式中&#xff0c;今天想跟大家分享的是原型模式&#xff0c;我觉的这种模式叫克隆模式会更佳恰当。原型模式的目的就是通过复制一个现有的对象来生成一个新…

vite4+vue3+electron23.3+ts桌面应用bs端开发 打包windows、linux、max三个系统的安装包

vite4vue3electron23.3ts桌面应用bs端开发 打包windows、linux、max三个系统的安装包 主要包依赖 "electron-store": "^8.1.0", //全局数据状态管理&#xff0c;可选择性安装"electron": "23.3.8","electron-builder": &q…

驱动控制LED灯

编写驱动代码&#xff0c;初步实现串口输入逻辑控制开发板的LED灯的亮灭 代码示例 head.h #ifndef __HEAD_H__ #define __HEAD_H__typedef struct {unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPD;unsigned int IDR;unsigned int ODR; }gp…

PDManer元数建模

学习文档 PDManer元数建模-v4-操作手册 (yuque.com)https://www.yuque.com/pdmaner/docs/pdmaner-manual#goEFW 建表 -- 创建用户表2 -- 创建用户表2 √ create table USER_TEST_WXX2 ( -- 主键自增generated by default as identity primary keyUSER_ID NUMBER g…

JAVA基础知识(一)——Java语言描述、变量和运算符

TOC(Java语言描述、变量和运算符) 一、JAVA语言描述 1.1 java语言描述 JDK、JRE、jVM三者之间的关系&#xff0c;以及JDK、JRE包含的主要结构有哪些&#xff1f; JDKJre java的开发工具&#xff08;javac.exe java.exe javadoc.exe&#xff09; jre jvmjava的核心类库 为什…

【Linux】【驱动】应用层和驱动层传输数据

【Linux】【驱动】应用层和驱动层传输数据 绪论1.如果我在应用层使用系统0 对设备节点进行打开&#xff0c;关闭&#xff0c;读写等操作会发生什么呢? 2 我们的应用层和内核层是不能直接进行数据传输的3 驱动部分的代码4 应用代码5 编译以及运行代码 绪论 Linux一切皆文件! 文…

Matplotlib学习挑战第五关--绘制多图subplot() 和 subplots()

Matplotlib 绘制多图 我们可以使用 pyplot 中的 subplot() 和 subplots() 方法来绘制多个子图。 subplot() 方法在绘图时需要指定位置&#xff0c;subplots() 方法可以一次生成多个&#xff0c;在调用时只需要调用生成对象的 ax 即可。 1、subplot subplot(nrows, ncols, in…

2.阿里云对象存储OSS

1.对象存储概述 文件上传&#xff0c;是指将本地图片、视频、音频等文件上传到服务器上&#xff0c;可以供其他用户浏览或下载的过程。文件上传在项目中应用非常广泛&#xff0c;我们经常发抖音、发朋友圈都用到了文件上传功能。 实现文件上传服务&#xff0c;需要有存储的支持…

驱动DAY3 控制三盏灯亮灭

1.头文件 #ifndef __HEAD_H__ #define __HEAD_H__ //LED1 PE10 和 LED3 PE8 #define PHY_LED1_MODER 0X50006000 #define PHY_LED1_ODR 0X50006014 #define PHY_LED1_RCC 0X50000A28 //LED2 PF10 #define PHY_LED2_MODER 0X50007000 #define PHY_LED2_ODR 0X50007014#endif 2…