📜  Julia 中的随机数生态系统——自然的一面

📅  最后修改于: 2021-11-25 04:44:01             🧑  作者: Mango

如果我们敏锐地观察,随机性可以有效地从自然中衍生出来。尽管可以用科学现象来解释,地球上大多数物质的行为是随机的(尽管它可能取决于周围的条件)。例如:树上树叶的飘动虽然在物理学上是合理的,但对人眼来说是随机的,足球场上球员的运动虽然受到球的策略/位置等的影响,但也是相当随机的。
在上一篇文章中,我们讨论了随机数生成的数学/算法方法,因此是。伪随机数生成器非常适合一般应用。但他们曾经有过缺点。如果第三人知道 RNG 初始化的种子值,他/她可以轻松预测 RNG 可能给出的数字序列。这可能会导致应用阶段出现严重失误。

真随机数生成器 (TRNG)

要解决这个问题,一种方法是使用TRNGs(True Random Number Generators)而不是PRNGs
但是TRNG的生成往往非常缓慢,用户可能需要等待才能获得所需数量的随机值。此外,它们的性能/有效性在很大程度上取决于来源。例如:初始值可能无法预测,但我们最终可能会得到一致的随机数模式/流。
另一种方法是用TRNG生成的值为PRNG设置种子。这样我们的种子值,因此最终输出往往变得更安全,因为种子值也是随机的。有许多可用的TRNG源。最随机的来源之一是对雷声、空间碎片等造成的大气噪声。这种方法非常有效,并且经常被使用。

将自然的随机性引入计算机

从自然界生成随机数是一种经典而有效的方法。 Random.org是一个从大气噪声中产生随机性的组织。您可以查看上面的链接并使用他们提供的服务。但是,如果我们运行的模拟需要在特定步骤自主和连续输入随机数呢?我们不能每次都访问random.org网站并复制数字。幸运的是, Random.org提供了一个API ,允许开发人员为其接口编写客户端。然后API 客户端将直接对 Random.org 服务器进行HTTP 调用并获取所需的数据。

Julia 中的 TRNG

来到Julia ,可以利用JSON-RPC请求和HTTP调用(尽管分别是HTTP.jlJSON.jl )。但是手动发出POST请求,每次我们需要随机数时可能会变得很烦人。幸运的是, Randomorg_API.jl包为我们处理了这个问题。包含详细自述文件的包链接可在此处获得。
目前该包支持以下功能:

generateIntegers()函数

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

例子:

Python3
# import the package
using Randomorg_API
 
# generate 4 integers from 1-1000
generateIntegers(4, 1, 1000, true)


Python3
# generate 2 integer sequqnces
# length 4 and in the interval [-100 100]
generateIntegerSequences(2, 4, -100, 100, true)


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


Python3
# generate 4 random numbers
# belonging to a normal-distribution
# with mean 0 and standard-deviation 4.5
# and 2 significant digits
generateGaussians(4, 0, 4.5, 2)


Python3
# generate 4 random strings
# each of length 4, (a-j)
# without any repetition
generateStrings(4, 4, "abcdefghij", false)


Python3
# generate 4 random UUIDs
generateUUIDs(4)


Python3
# generate 4 random data blobs
# belonging to a normal-distribution
# of 50 bits each of base64 type
generateBlobs(4, 56, "base64")


输出:

generateIntegerSequences()函数

此方法生成用户定义范围内的真随机整数的统一或多形式序列
句法:

generateIntegerSequences(n, length, min, max, replacement)

例子:

蟒蛇3

# generate 2 integer sequqnces
# length 4 and in the interval [-100 100]
generateIntegerSequences(2, 4, -100, 100, true)

输出:

generateDecimalFractions()函数

此方法从跨区域的均匀分布生成真正的随机十进制分数
[0, 1] 间隔与用户定义的小数位数。

例子:

蟒蛇3

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

输出:

generateGaussians()函数

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

该表格使用Box-Muller 变换从均匀分布的数字生成高斯分布
例子:

蟒蛇3

# generate 4 random numbers
# belonging to a normal-distribution
# with mean 0 and standard-deviation 4.5
# and 2 significant digits
generateGaussians(4, 0, 4.5, 2)

输出:

generateStrings()函数

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

例子:

蟒蛇3

# generate 4 random strings
# each of length 4, (a-j)
# without any repetition
generateStrings(4, 4, "abcdefghij", false)

输出:

generateUUIDs()函数

此方法生成版本 4真随机通用唯一标识符(UUID)
句法:

generateUUIDs(n)

例子:

蟒蛇3

# generate 4 random UUIDs
generateUUIDs(4)

输出:

generateBlobs()函数

此方法生成包含真正随机数据的二进制大对象 (BLOB)

例子:

蟒蛇3

# generate 4 random data blobs
# belonging to a normal-distribution
# of 50 bits each of base64 type
generateBlobs(4, 56, "base64")

输出:

有很多这样的在线服务,如:费米实验室HotBits服务使用放射性,世界著名的CloudFlare使用了大量的熔岩灯图像处理的随机数生成的。
您可能还记得上一篇文章,我们讨论了英特尔芯片上基于硬件的随机数生成器,即。 RDRAND 。有人可能想知道我们是否可以直接与RDRAND通信以获得处理器生成的熵。在 Julia 中,我们使用这个包来利用这种方法。这是一个写得很好的模块,您可以考虑尝试一下。

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程