如果我们敏锐地观察,随机性可以有效地从自然中衍生出来。尽管可以用科学现象来解释,地球上大多数物质的行为是随机的(尽管它可能取决于周围的条件)。例如:树上树叶的飘动虽然在物理学上是合理的,但对人眼来说是随机的,足球场上球员的运动虽然受到球的策略/位置等的影响,但也是相当随机的。
在上一篇文章中,我们讨论了随机数生成的数学/算法方法,因此是伪。伪随机数生成器非常适合一般应用。但他们曾经有过缺点。如果第三人知道 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.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.
例子:
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] 间隔与用户定义的小数位数。
Syntax:
generateDecimalFractions(n, decimalPlaces, replacement)
Parameters:
decimalPlaces: The number of decimal places to use.
例子:
蟒蛇3
# 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 变换从均匀分布的数字生成高斯分布。
例子:
蟒蛇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()函数
此方法生成真正的随机字符串。
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.
例子:
蟒蛇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) 。
Syntax:
generateBlobs(n, size, format)
例子:
蟒蛇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 现场工作专业课程和学生竞争性编程现场课程。