如果我们敏锐地观察到,随机性可以有效地源自自然。尽管可以用科学现象解释,但地球上大多数物质的行为都是随机的(尽管它可能取决于周围的条件)。例如:树叶在物理上是合理的,尽管在物理上是合理的,但人眼是随机的,而足球场上球员的运动虽然受到球的策略/位置等的影响,但又是相当随机的。
在上一篇文章中,我们讨论了用于随机数生成的数学/算法方法,因此是伪方法。伪随机数生成器非常适合一般应用。但是它们曾经有缺点。如果第三方知道用于初始化RNG的种子值,则他/她可以轻松预测RNG可能给出的数字顺序。这可能会导致应用程序阶段严重延迟。
真随机数生成器(TRNG)
要解决此问题,一种解决方法是使用TRNG(真随机数生成器)代替PRNG 。
但是, TRNG的生成往往会非常缓慢,并且用户可能必须等待才能获得所需数量的随机值。同样,它们的性能/有效性在很大程度上取决于来源。例如:初始值可能无法预测,但最终可能会得到一致的模式/随机数流。
另一种方法是使用TRNG生成的值为PRNG播种。这样,由于种子值也是随机的,因此我们的种子值(因此最终输出)往往变得更加安全。有许多可用的TRNG来源。最随机的来源之一是由于雷声,空间碎片等引起的大气噪声。这种方法非常有效,并且被广泛使用。
将自然的随机性引入计算机
从自然界中产生随机数是一种经典而有效的方法。 Random.org是一个从大气噪声中产生随机性的组织。您可以检查上面的链接并使用它们提供的服务。但是,如果我们正在运行一个需要在特定步骤自动连续输入随机数的模拟,该怎么办?我们只是不能每次都去random.org网站复制号码。幸运的是, Random.org提供了一个API ,允许开发人员为其接口编写客户端。然后, API客户端将直接对Random.org服务器进行HTTP调用,并获取所需的数据。
朱莉娅的TRNG
来到Julia ,提供了利用JSON-RPC请求和HTTP调用的功能(尽管分别为HTTP.jl和JSON.jl )。但是,手动发出POST请求时,每次我们需要随机数时,都会感到厌烦。幸运的是, Randomorg_API.jl程序包可以为我们解决这个问题。带有详细自述文件的软件包链接可在此处获得。
当前,该软件包支持以下功能:
generateIntegers()函数
此方法在用户定义的范围内生成真正的随机整数。
Syntax:
generateIntegers(n, min, max, replacement)
Parameters:
- n: It specifies how many random integers you need.
- min: It is the lower boundary for the range from which the random numbers will be picked.
- max: It is the upper boundary for the range from which the random numbers will be picked.
- replacement: It specifies whether the random numbers should be picked with replacement. The default (true) will cause the numbers to be picked with replacement, i.e., the resulting numbers may contain duplicate values. If you want the numbers picked to be unique, set this value to false.
例子:
# import the package
using Randomorg_API
# generate 4 integers from 1-1000
generateIntegers(4, 1, 1000, true)
输出:
generateIntegerSequences()函数
此方法生成用户定义范围内的真实随机整数的统一或多形式序列。
句法:
generateIntegerSequences(n, length, min, max, replacement)
例子:
# generate 2 integer sequqnces
# length 4 and in the interval [-100 100]
generateIntegerSequences(2, 4, -100, 100, true)
输出:
generateDecimalFractions()函数
此方法根据跨所有对象的均匀分布生成真正的随机十进制小数
[0,1]间隔,带有用户定义的小数位数。
Syntax:
generateDecimalFractions(n, decimalPlaces, replacement)
Parameters:
decimalPlaces: The number of decimal places to use.
例子:
# generate 4 float values
# with 3 decimal places each
generateDecimalFractions(4, 3, true)
输出:
generateGaussians()函数
此方法根据高斯分布(也称为
正态分布)。
Syntax:
generateGaussians(n, mean, standardDeviation, significantDigits)
Parameters:
- mean The distribution’s mean.
- standardDeviation The distribution’s standard deviation.
该表格使用Box-Muller变换从均匀分布的数字生成高斯分布。
例子:
# generate 4 random numbers
# belonging to a normal-distribtuion
# with mean 0 and standard-deviation 4.5
# and 2 significant digits
generateGaussians(4, 0, 4.5, 2)
输出:
generateStrings()函数
此方法生成真正的随机字符串。
Syntax:
generateStrings(n, length, characters, replacement)
Parameters:
- characters: A string that contains the set of characters that are allowed to occur in the random strings.
- length: The length of each string.
例子:
# generate 4 random strings
# each of length 4, (a-j)
# without any repetition
generateStrings(4, 4, "abcdefghij", false)
输出:
generateUUIDs()函数
此方法生成版本4真正的随机通用唯一标识符(UUID)
句法:
generateUUIDs(n)
例子:
# generate 4 random UUIDs
generateUUIDs(4)
输出:
generateBlobs()函数
此方法生成包含真实随机数据的二进制大对象(BLOB) 。
Syntax:
generateBlobs(n, size, format)
size: The size of each blob, measured in bits and must be divisible by 8.
format: Specifies the format in which the blobs will be returned. Values allowed are base64 and hex.
例子:
# generate 4 random data blobs
# belonging to a normal-distribtuion
# of 50 bits each of base64 type
generateBlobs(4, 56, "base64")
输出:
有很多这样的在线服务,如:费米实验室的HotBits服务使用放射性,世界著名的CloudFlare使用了大量的熔岩灯和图像处理的随机数生成的。
您可能还记得前一篇文章,我们谈到了Intel芯片上基于硬件的随机数生成器,即。 RDRAND 。有人可能想知道我们是否可以直接与RDRAND通信以获取处理器生成的熵。在Julia中,我们通过此包使用了这种方法。这是一个写得很好的模块,您可以考虑尝试一下。