一文详解编程中的随机数

2023-10-27

随机数,相信大家都不陌生,网上有很多生成随机数的小工具。直观来看,随机数就是一串杂乱无章的数字、字母、以及符号的组合, 比如pSTkKIiZMOlDxOgwpIQGdlZwrJCRiHRK。但随机数真的就随机吗?真的就无法预测吗?什么场景下可以用什么方式来生成随机数呢? 这篇文章将为大家介绍随机数的类型,在程序中如何使用随机数,以及随机数在密码学中使用场景。希望能尽量地将在开发过程中需要用到的随机数知识都收纳在这里,方便大家进行查阅!

随机数的类型

在知乎上看到过一个说法,认为这个世界没有真正意义上的随机,比如扔骰子。如果能算对扔出时的转速、方向,并测出空气中的阻力,桌面的阻尼系数,骰子的质量 等等因素,那么就有机会算出骰子落地时的点数。我猜想赌神大概率也是基于这种原理吧。物理科学上是有“真正”意义的随机的,那就是量子力学的不可测原理。它是由德国著名物理学家海森堡在1927年发表的论文《论量子理论运动学与力学的物理内涵》中提出来的。不是特别理解其中的内容,但是从字面上简单的理解,就是对于微观粒子,它的速度和位置不能准确测量,当对其中一个物理量测量得越准确时,另一个物理量就越模糊。

从编程角度看,我们的随机数生成器分为两种大类型,一种是真随机数生成器,一种是伪随机数生成器。

真随机数生成器 TRNG - True Random Number Generator

前面说了实际上基本没有真正意义随机,那程序和算法本身就更加不能产生真随机,但是我们可以想办法迂回地产生统计意义上的真随机。比如Linux内核的随机数发生器: Linux维持一个熵池,不断地收集非确定性的事件,比如时钟,鼠标的移动,键盘的敲击, IO的响应时间,磁盘的速度,wifi的强弱,内存的变化等等,然后基于一定的算法给出一个数。

伪随机数生成器 PRNG - Pseudo Random Number Genrator

如果需要快速生成大量的随机数,那么真随机数生成器可能由于收集不到那么多的随机事件而产生阻塞行为。在不需要那么高安全级别的随机数需求下,我们可以采用伪随机数生成器来生成随机数。伪随机数生成器一般是基于一个给定的初始值,也就是种子 - seed,用一定的算法来算出一个数。且算法内部维持一个内部状态,每次生成一个新的随机数,这个值都会跟着变化,这样就能产生不一样的随机数来。常见的伪随机数生成器的算法有:

  • 线性同余法 - Linear Congruential Generator (简称LCG)
  • 马特赛特旋转演算法 - Mersenne Twister.

Java中的Random() 用的就是线性同余法。线性同余方法是目前应用广泛的伪随机数生成算法,其基本思想是通过对前一个数进行线性运算并取模从而得到下一个数,递归公式为:

在这里插入图片描述

其中A,B,M是产生器所用到的常量

随机数的使用

真随机数

我们可以通过下面这个命令得到操作系统内核提供的外部熵随机数生成器:

λ head -c 32 /dev/random | openssl enc -base64
zLvAZ2vfFTUQ+ENPLdbG2F8B3wv86LM9X2s3DeymN28=

这个命令将会从Linux内核的熵池中读取一个32位的随机数,并用64进制展示出来。我们也可以选择用数字的形式展示出来:

λ cat /dev/random| tr -dc '0-9' | fold -w 10| head -n 4
0231488700
4599846604
7629411051
4199097655

上面这个命令从熵池中4个10位的随机数,并用0-9展示出来。

但用这个命令的时候要小心,由于熵池中的值通过记录系统的随机事件得来的,那么就有可能有用完的时候,那么这时这个命令就会阻塞在这里,直到有系统随机事件进到熵池中才会继续。这样对程序来说不是很友好,于是操作系统的随机数生成器一般都提供另外一个工具,在熵池的随机事件用完之后,能用伪随机算法产生一个随机数给你:

λ cat /dev/urandom| tr -dc 'a-zA-Z0-9' | fold -w 10| head -n 4
EK0Z3g49By
csziDZeWtO
EhHu30IcM4
PyDyY47Ah5

Golang的内置随机数生成器rand就是基于 /dec/urandom来实现的。

开发中常见的随机数生成器

这里我们以Java语言为例,介绍一下常见的随机数生成器的用法。

  • Random()

首先一起来看一下这个最常见的Random. Random实现了基于线性同余法的伪随机数生成器,其构造函数接收作为种子的参数seed,如果不给定seed,则默认采用当前时间戳作为种子。 下面的函数可以生成指定位数的随机字母串:

public static String ALPHA = "abcdefghijkllmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";   
public static String generate_alphabetic_using_Random(int length
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一文详解编程中的随机数 的相关文章

随机推荐

  • 三个线程T1,T2,T3.保证顺序执行的三种方法

    第一种方式 顺序在线程中创建实例 最容易想到的办法 public class TestTwo static TestTwo t new TestTwo class T1 extends Thread Override public void
  • protobuf 2.0版本排查必填字段未填的方法

    在proto2 0版本中 如果required字段没有填写 那么proto编码字符串发给对方进行parse时 对方会parse失败 因此有必要在发送前检查一下是否存在这种情况 特别是在debug阶段 1 为了获取proto序列化的错误信息
  • shell 读取文件第几行 第几列的值

    1 问题 读取 list文件 内容如下 中 NO1 和NO2 的值 platform NO1 NO2 AIX 64 1 20 NT X64 2 21 LINUX X64 3 22 HPIA 64
  • 最详细的【基数排序】---排序算法,思路清晰动图保姆级讲解,五分钟搞懂!

    基数排序 已同步微信公众号 乐享Coding 想要一起学习的可以加群 共同交流 基本思想 将所有待比较数值统一为同样的数位长度 数位较短的数前面补零 从最低位开始 依次进行一次排序 这样从最低位排序一直到最高位排序完成以后 数列就变成一个有
  • 通用mapper的常用查询,select和selectByPrimaryKey

    通用mapper 的查询总结 1 如果是等值查询 根据其主键查询 则可以用selectByPrimaryKey 如果不是主键 而是根据其他值查询 那么用select T t T为通用mapper对应的类类型 这里传入一个该类的实例 根据改实
  • linux系统盘大小显示64Z,linux磁盘容量变为64Z

    author skate time 2012 06 05 linux磁盘容量变为64Z root localhost df h 文件系统 容量 已用 可用 已用 挂载点 dev sda3 255G 2 6G 240G 2 dev sda1
  • matlab敏感词输出代码,敏感词过滤的简易实现

    介绍 很多时候我们需要对接受的文本进行过滤 剔除一下不当用词 比如一些反动的 侮辱性的 淫秽的用语 一般会有一个敏感词词库 基于这个词库对输入的文本进行过滤 分享一种简易的实现 示例中为了和谐 将不会出现上述违反社会主义核心价值观的词汇 使
  • 免费简单的在线QQ聊天

    今天在写电商网站的时候 用JSP AJAX写聊天功能写的够蛋疼的 突然想到 有谁会在你这个网站上不知道对方上线有空回你没有整天挂着这个网站呢 比起在网站上聊天 倒不如直接在QQ上聊天 所以目标就是实现点击一个链接直接在QQ上于另外一个人链接
  • 分布式缓存(面试使用)

    一 缓存穿透 含义 缓存中取不到数据 直接透过缓存请求db 如果是恶意攻击 会使数据库崩 方案 1 对于自己系统可以根据bloom filter算法计算一个hash值 只对自己系统业务请求 如果是其他请求则过滤 2 空值缓存 对于没有的ke
  • 快速排序c语言

    include
  • IDEA中的Git操作之创建分支与切换分支

    背景 前文 我们已经能够通过IDEA将本地的项目代码提交到GitHub上了 本文主要来讲讲如何在IDEA中创建Git分支 以及怎么切换分支 创建一个分支 master gt New Branch 填写分支名称 Create 创建分支成功后
  • 合理使用DTO(Data Transfer Object)

    文章目录 1 DTO简介 2 到底什么是DTO 3 将DTO用作POJO 4 Java 中使用DTO的例子 5 反例 滥用DTO 6 小结 相关链接 DTO 全称为 Data Transfer Object 我们一般称之为 数据传输对象 1
  • chrony命令的相关练习,适合新手!!!

    chrony命令基本使用 有些系统本身就有这个命令不需要我们再安装 使用rpm qa grep chrony可以查看一下 查看 ntp servers chronyc sources v 查看 ntp servers 状态 chronyc
  • 高赞:为什么别选计算机专业?

    在知乎看到一个这样的问题 为什么别选计算机专业 nbsp 这个话题有 800 万人次浏览 以下是一位匿名用户的高赞回答 内容可能比较主观化 仅代表原作者个人观点 如果有不同意见欢迎留言区交流啊 不明白现在鼓吹计算机是什么意思 985计算机毕
  • [peft]ImportError: cannot import name ‘is_npu_available‘ from ‘accelerate.utils‘

    今天在使用peft库的时候出现了下面的错误 估计是peft刚出来还不太稳定的原因 ImportError cannot import name is npu available from accelerate utils 解决方法 pip
  • maven package 打包test出错导致打包失败

    第二个方法解决了 https blog csdn net u010515155 article details 78458232
  • 记录:基于vue使用ag-grid表格(基本用法)

    首先还是安装ag grid npm install ag grid vue 在main js引入 Vue component ag grid vue AgGridVue import ag grid enterprise styles ag
  • 详解Node.js API系列 Crypto加密模块(2) Hmac

    简介 随着互联网的发展 MD5已经变得越来越不安全了 黑客可以通过彩虹表 查出MD5值所对应的密码 为了解决这个问题 很多网站都开始采用需要密钥加密的Hmac算法 Hmac算法 HMAC是密钥相关的哈希运算消息认证码 Hash based
  • 第四章 STP协议

    目录 环路问题 STP树的生成 STP报文格式 STP的改进 STP配置示例 环路问题 为了提高网络的可靠性 交换网络中通常会使用冗余链路 然而 在冗余链路中会给交换网络带来环路风险 并导致广播风暴以及MAC地址表不稳定等的问题 进而影响到
  • 一文详解编程中的随机数

    一文详解编程中的随机数 随机数的类型 真随机数生成器 TRNG True Random Number Generator 伪随机数生成器 PRNG Pseudo Random Number Genrator 随机数的使用 真随机数 开发中常