<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://wiki.riguz.com/index.php?action=history&amp;feed=atom&amp;title=Blog%3A%E5%85%B3%E4%BA%8E%E9%9A%8F%E6%9C%BA%E6%95%B0</id>
	<title>Blog:关于随机数 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.riguz.com/index.php?action=history&amp;feed=atom&amp;title=Blog%3A%E5%85%B3%E4%BA%8E%E9%9A%8F%E6%9C%BA%E6%95%B0"/>
	<link rel="alternate" type="text/html" href="https://wiki.riguz.com/index.php?title=Blog:%E5%85%B3%E4%BA%8E%E9%9A%8F%E6%9C%BA%E6%95%B0&amp;action=history"/>
	<updated>2026-06-02T20:39:43Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.42.3</generator>
	<entry>
		<id>https://wiki.riguz.com/index.php?title=Blog:%E5%85%B3%E4%BA%8E%E9%9A%8F%E6%9C%BA%E6%95%B0&amp;diff=2660&amp;oldid=prev</id>
		<title>imported&gt;Riguz：​随机数顾名思义就是你无法确定的一个数（但是你可以设定一个范围），就好比彩票摇号一样，所有可能的组合是知道的，但是到底会摇出个什么数字出来，谁都不知道。否则我早就买彩票去了😂 那随机数是怎么生成出来的？</title>
		<link rel="alternate" type="text/html" href="https://wiki.riguz.com/index.php?title=Blog:%E5%85%B3%E4%BA%8E%E9%9A%8F%E6%9C%BA%E6%95%B0&amp;diff=2660&amp;oldid=prev"/>
		<updated>2018-12-03T00:00:00Z</updated>

		<summary type="html">&lt;p&gt;随机数顾名思义就是你无法确定的一个数（但是你可以设定一个范围），就好比彩票摇号一样，所有可能的组合是知道的，但是到底会摇出个什么数字出来，谁都不知道。否则我早就买彩票去了😂 那随机数是怎么生成出来的？&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;随机数顾名思义就是你无法确定的一个数（但是你可以设定一个范围），就好比彩票摇号一样，所有可能的组合是知道的，但是到底会摇出个什么数字出来，谁都不知道。否则我早就买彩票去了😂 那随机数是怎么生成出来的？&lt;br /&gt;
&lt;br /&gt;
= 随机数的定义=&lt;br /&gt;
引用维基百科，&lt;br /&gt;
&lt;br /&gt;
&amp;gt; 根据密码学原理，随机数的随机性检验可以分为三个标准：&lt;br /&gt;
&lt;br /&gt;
&amp;gt; * 统计学伪随机性。统计学伪随机性指的是在给定的随机比特流样本中，1的数量大致等于0的数量，同理，“10”“01”“00”“11”四者数量大致相等。类似的标准被称为统计学随机性。满足这类要求的数字在人类“一眼看上去”是随机的。&lt;br /&gt;
&amp;gt; * 密码学安全伪随机性。其定义为，给定随机样本的一部分和随机算法，不能有效的演算出随机样本的剩余部分。&lt;br /&gt;
&amp;gt; * 真随机性。其定义为随机样本不可重现。实际上衹要给定边界条件，真随机数并不存在，可是如果产生一个真随机数样本的边界条件十分复杂且难以捕捉（比如计算机当地的本底辐射^[本体辐射是指人类生活环境本来存在的辐射，主要包括宇宙射线和自然界中天然放射性核素发出的射线。]波动值），可以认为用这个方法演算出来了真随机数。但实际上，这也只是非常接近真随机数的伪随机数，一般认为，无论是本地辐射、物理噪音、抛硬币……等都是可被观察了解的，任何基于经典力学产生的随机数，都只是伪随机数。&lt;br /&gt;
&lt;br /&gt;
&amp;gt; 相应的，随机数也分为三类：&lt;br /&gt;
&lt;br /&gt;
&amp;gt; * 伪随机数：满足第一个条件的随机数。&lt;br /&gt;
&amp;gt; * 密码学安全的伪随机数：同时满足前两个条件的随机数。可以通过密码学安全伪随机数生成器计算得出。&lt;br /&gt;
&amp;gt; * 真随机数：同时满足三个条件的随机数。&lt;br /&gt;
&lt;br /&gt;
= Linux系统中的随机数设备=&lt;br /&gt;
&lt;br /&gt;
Linux以及一些类Unix系统中有随机数的特殊文件，一般如下：&lt;br /&gt;
&lt;br /&gt;
* /dev/random :提供基于当前系统熵池^[指设备驱动程序或其它来源的背景噪声计算出来的某种结果]的真随机数&lt;br /&gt;
* /dev/urandom:是非阻塞的随机数生成器&lt;br /&gt;
&lt;br /&gt;
两者都是CSPRNG^[Cryptographically Secure Pseudorandom Number Generator，加密安全的伪随机数生成器]，可以使用以下命令来输出：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
od -An -N1 -i /dev/random&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= 一些伪随机数生成算法=&lt;br /&gt;
&lt;br /&gt;
== 平方取中法==&lt;br /&gt;
&lt;br /&gt;
这个算法比较简单，由冯·诺伊曼在1946年提出。 算法步骤如下：&lt;br /&gt;
&lt;br /&gt;
* 选择一个 ${\displaystyle m}$ 位数 ${\displaystyle N_{i}}$ 作为种子&lt;br /&gt;
* 计算 ${\displaystyle N_{i}^{2}}$&lt;br /&gt;
* 若 ${\displaystyle N_{i}^{2}}$不足 ${\displaystyle 2m}$个位，在前补0。在这个数选中间 ${\displaystyle m}$个位的数，即 ${\displaystyle 10^{\lfloor {\frac {m}{2}}\rfloor +1}} {\displaystyle 10^{\lfloor {\frac {m}{2}}\rfloor +1}}$至 ${\displaystyle 10^{\lfloor {\frac {m}{2}}\rfloor +m}} {\displaystyle 10^{\lfloor {\frac {m}{2}}\rfloor +m}}$的数，将结果作为 ${\displaystyle N_{i+1}}$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 线性同余法==&lt;br /&gt;
&lt;br /&gt;
这个算法根据递归公式计算:&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
X_{n+1}=\left(aX_{n}+c\right)~~{\bmod {~}}~m&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Java中的Random类就是使用就是这种算法。但这个不是密码学安全的随机数算法，如果要生成密码学安全的随机数，需要使用SecureRandom类来生成。&lt;br /&gt;
&lt;br /&gt;
== Blum Blum Shub==&lt;br /&gt;
&lt;br /&gt;
采用如下的递归公式计算：&lt;br /&gt;
&lt;br /&gt;
$$&lt;br /&gt;
x_{n+1}=x_{n}^{2}{\bmod  M}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
其中：$M=p\cdot q$是两个大素数p和q的乘积&lt;br /&gt;
&lt;br /&gt;
例如令${\displaystyle p=11}$, ${\displaystyle q=19}$, ${\displaystyle s=3}$，则：&lt;br /&gt;
&lt;br /&gt;
=. ${\displaystyle x_{0}=3^{2}{\bmod 209}=9}$=&lt;br /&gt;
=. ${\displaystyle x_{1}=9^{2}{\bmod 209}=81}$=&lt;br /&gt;
=. ${\displaystyle x_{2}=81^{2}{\bmod 209}=82}$=&lt;br /&gt;
=. ${\displaystyle x_{3}=82^{2}{\bmod 209}=36}$=&lt;br /&gt;
=. ...=&lt;br /&gt;
&lt;br /&gt;
除此之外，还有一些其他的随机数算法，便不过多介绍。&lt;br /&gt;
&lt;br /&gt;
参考: &lt;br /&gt;
&lt;br /&gt;
* [http://www.2uo.de/myths-about-urandom/ Myths about /dev/urandom]&lt;br /&gt;
* [http://www.cnblogs.com/Geometry/archive/2011/01/25/1944582.html 一个生成伪随机数的超级算法]&lt;/div&gt;</summary>
		<author><name>imported&gt;Riguz</name></author>
	</entry>
</feed>