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

这篇具有很好参考价值的文章主要介绍了【LINUX相关】生成随机数(srand、/dev/random 和 /dev/urandom )。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、问题背景

在一个循环中,生成多组随机值,发现最终的结果都一样,结果是调用的函数如下,在函数中设置了随机种子,且是以秒为单位,那么在一秒类,由于都是用一个种子,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相关】生成随机数(srand、/dev/random 和 /dev/urandom ),LINUX学习,linux,随机数
Linux 4.8 以后
【LINUX相关】生成随机数(srand、/dev/random 和 /dev/urandom ),LINUX学习,linux,随机数
简化图
【LINUX相关】生成随机数(srand、/dev/random 和 /dev/urandom ),LINUX学习,linux,随机数

3.2.3 二者的区别和选择

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

四、在代码的使用方法

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

【LINUX相关】生成随机数(srand、/dev/random 和 /dev/urandom ),LINUX学习,linux,随机数
所以需要做一些转化,比如

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代表要生成的随机数的位数文章来源地址https://www.toymoban.com/news/detail-653107.html

到了这里,关于【LINUX相关】生成随机数(srand、/dev/random 和 /dev/urandom )的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python生成随机数的一个标准库-random

    Random库Python中用于生成随机数的一个标准库。计算机没有办法产生真正的随机数,但它可以产生伪随机数。 伪随机数是计算机按照一定的运算规则产生的一些数据,只不过这些数据表现为随机数的形式。计算机中采用梅森旋转算法生成为随机序列,序列中的每一个元素就是伪

    2023年04月26日
    浏览(33)
  • 【JavaSE API 】生成随机数的2种方法:Random类和Math类的Random方法

    Random类和Math类的random方法都可以用来生成随机数 而Math类的random方法则是 基于系统时间 的伪随机数生成器,= 0.0 , 1.0的随机double值范围[0,1)。例如: double num1 = Math.random() * 5 + 4;//范围[4,9) Random类是 基于种子 的伪随机数生成器,有含参数和不含参数两种构造方式,不含参数的

    2024年02月07日
    浏览(43)
  • R语言【base】——.Random.seed(),RNGkind(),RNGversion(),set.seed():随机数生成器

    Package  base  version 4.2.0 .Random.seed是一个整数向量,包含R中生成随机数的随机数生成器(RNG)状态。它可以保存和恢复,但不应该被用户更改。 RNGkind是一个更友好的接口,用于查询或设置正在使用的RNG类型。 RNGversion在早期的R版本中可以用来设置随机生成器(为了再现性)。 set

    2024年02月22日
    浏览(39)
  • Jmeter-BeanShell脚本中for循环里面使用random随机数函数,每次生成的都一样

    预想的是每次循环生成的随机数不一样,但实际使用Random函数生成的是重复的。 以下是部分原代码: 生成的updateList为: [{“id”:235214718648462,“dataId”:null,“data”:6708,“type”:“number”}, {“id”:318239582208002,“dataId”:333989510397954,“data”:6708,“type”:“number”}, {“id”:33398948

    2024年01月20日
    浏览(45)
  • rand()函数与srand()函数以及随机数种子详解

    初学者大部分对这两个函数的意义都不甚了解,以及不明白为什么需要srand()函数来播种,这里会对两函数的意义进行解释,让大家明白两函数搭配的作用,并对伪随机数以及真随机数进行讲解,最后会对随机数生成的原理进行一些探讨,希望对大家的学习理解有所帮助 格式

    2024年01月25日
    浏览(37)
  • C语言随机数的产生(rand、srand、time函数细节讲解)

    先上代码,再详细解释: 我们先来查询下rand函数 网站旧版我放在这儿,可以查询库函数等https://legacy.cplusplus.com/reference/cstring/strcat/ rand函数的头文件是stdlib.h。 rand函数无需传参数,返回类型是一个伪随机的整数范围是0到RAND_MAX。那这个RAND_MAX所对应的值是多少呢?我们同样

    2024年02月08日
    浏览(38)
  • java random随机数的用法

    Java Random类是Java中生成随机数的一个重要工具类,它提供了丰富的方法来生成不同类型的随机数。在本文中,我们将深入探讨Java Random类的用法,并介绍一些常见的应用场景。 Random类位于 java.util 包中,因此在使用前需要先导入该包: Random类的实例化非常简单,只需调用其默

    2024年02月06日
    浏览(32)
  • 【Linux】随机数的生成

    /dev/random是一个随机数生成器设备文件,用于生成高质量的随机数。它通过收集系统上的环境噪声(例如硬件噪声,磁盘活动等)来产生随机数。由于它只在系统上有足够的环境噪声时才能生成随机数,因此/dev/random生成的随机数是高质量的。 但是,/dev/random的主要缺点是,如

    2024年02月11日
    浏览(36)
  • JavaSE基础(三)—— 程序流程控制、Random随机数

    目录 一、顺序结构 二、分支结构 1. if 1.1 if分支有三种格式​编辑 2. switch 2.1 if、switch分支各自适合做什么业务场景 3. switch的穿透性 三、循环结构  1. for 循环​编辑 2. while 循环 2.1 什么时候用for循环,什么时候用while循环 3. do-while循环 4. 三种循环的区别 5. 死循环 6

    2024年02月02日
    浏览(42)
  • 解决Fortify漏洞:Insecure Randomness(不安全随机数)

           Fortify漏洞:Insecure Randomness(不安全随机数)指的是代码中使用了不安全或弱随机数生成器导致的安全漏洞。随机数在密码学应用、加密和解密等领域中经常被使用,如果生成的随机数不够随机或不够复杂,则会使得攻击者可以轻易地猜出生成的随机数,从而对系统

    2024年02月10日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包