确定性的计算机程序无法生成真正意义上的随机数。对绝大多数用途而言 pseudo-random numbers伪随机数 已经足够。伪随机数序列以确定性方式生成:这些数并非真正随机,但具备模仿随机序列的若干特性。例如,所有可能的取值在伪随机序列中出现的频率大致均等。
伪随机数由 seed value种子值 生成。从任意给定种子出发,random 函数总会生成相同的数值序列。默认情况下,Emacs 会在启动时初始化随机种子,使得每次运行 Emacs 得到的 random 序列(极大概率)互不相同。随机种子通常从系统熵源初始化;但在缺少熵池的旧平台上,种子会取自随机性较弱的易变数据(如当前时间)。
有时你希望随机数序列可复现。例如,调试行为依赖随机序列的程序时,让程序每次运行行为一致会很有帮助。要让序列可复现,执行 (random "")。这会将种子设为当前 Emacs 可执行文件对应的固定值(不同编译版本可能不同)。你也可以使用其他字符串来指定不同的种子。
该函数返回一个伪随机整数。重复调用会生成一系列伪随机整数。
如果 limit 是正整数:返回非负且小于 limit 的整数。否则:返回值可以是任意定长整数(fixnum),即从 most-negative-fixnum 到 most-positive-fixnum 之间的任意整数(see 整数基础)。
如果 limit 是字符串:根据字符串内容设置新种子,后续 random 调用将返回可复现的结果序列。
如果 limit 是 t:按 Emacs 重启的方式重新选取种子,后续 random 调用将返回不可预测的结果序列。
如果你需要用于密码学场景的随机数(nonce),通常不建议使用 random,原因如下:
(random t) 读取系统熵,这也可能影响程序中依赖结果可复现性的其他部分。
random 使用的、与系统相关的伪随机数生成器(PRNG)不一定适合密码学安全场景。
(random t) 不会直接访问系统熵,熵会经过系统相关的 PRNG 处理,可能导致结果存在偏差。
(random t) 会将相关信息散布在 Emacs 内部状态中,扩大内部攻击面。
(random t) 的种子来自密码学强度较弱的数据源。