📜  朱莉娅的随机数生态系统–自然的一面

📅  最后修改于: 2021-05-05 00:31:52             🧑  作者: Mango

如果我们敏锐地观察到,随机性可以有效地源自自然。尽管可以用科学现象解释,但地球上大多数物质的行为都是随机的(尽管它可能取决于周围的条件)。例如:树叶在物理上是合理的,尽管在物理上是合理的,但人眼是随机的,而足球场上球员的运动虽然受到球的策略/位置等的影响,但又是相当随机的。

在上一篇文章中,我们讨论了用于随机数生成的数学/算法方法,因此是伪方法。伪随机数生成器非常适合一般应用。但是它们曾经有缺点。如果第三方知道用于初始化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.jlJSON.jl )。但是,手动发出POST请求时,每次我们需要随机数时,都会感到厌烦。幸运的是, Randomorg_API.jl程序包可以为我们解决这个问题。带有详细自述文件的软件包链接可在此处获得。

当前,该软件包支持以下功能:

generateIntegers()函数

此方法在用户定义的范围内生成真正的随机整数

例子:

# 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]间隔,带有用户定义的小数位数。

例子:

# generate 4 float values
# with 3 decimal places each
generateDecimalFractions(4, 3, true)

输出:

generateGaussians()函数

此方法根据高斯分布(也称为
正态分布)。

该表格使用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()函数

此方法生成真正的随机字符串

例子:

# 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)

例子:

# 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中,我们通过此包使用了这种方法。这是一个写得很好的模块,您可以考虑尝试一下。