使用 NumPy 实现几乎随机的数字和分布
介绍
随机数被认为是计算领域的一种“圣杯”。随机性似乎很难捉摸;当代处理器很难生成真正的随机数。然而,随机性在各种实际应用中都至关重要。大多数现代加密方法都依赖于真正随机数的生成(例如,一束熔岩灯如何保护我们免受黑客攻击)。
对于我们这些不需要自然现象的真正随机性的人来说,有一个足够好的替代方案:伪随机数 (PRN)。这是一种奇特的说法,即给定“种子”即可重新生成的随机数。让我们看看如何使用 NumPy 生成伪随机数。(注意:您可以使用 Python 的标准库完成此处描述的许多任务,但这些任务会生成原生 Python 数组,而不是更强大的 NumPy 数组。)
以下所有示例都需要在顶部添加以下几行:
import numpy.random as random
#The following is what we call "seeding" the PRNG.
random.seed(100)
当 PRNG 以相同的值(本例中为 100)作为种子时,它将始终生成相同的随机数序列。这样,您的机器上生成的值应该与本指南中列出的值相同。这就是 PRNG 被认为“加密不安全”的原因。任何拥有种子的人都可以生成与您完全相同的随机数序列。
生成 PRNG
让我们首先生成几个 PRN 并将它们记录到控制台。
print(random.rand(1))
print(random.rand(1))
rand()从 0 到 1 之间的均匀分布中选择随机数。因为我们使用了种子,所以无论在何时何地运行,它都会始终生成以下随机数:
0.54340494]
[ 0.27836939
请注意,rand(1)调用有一个参数。rand ()在给定一个参数时返回一个数组,参数表示数组的形状。
# We're going to print an array with dimensions 10x2.
print(random.rand(10, 2))
以上将输出从均匀分布中选择的二维随机数数组:
[ 0.54340494 0.27836939]
[ 0.42451759 0.84477613]
[ 0.00471886 0.12156912]
[ 0.67074908 0.82585276]
[ 0.13670659 0.57509333]
[ 0.89132195 0.20920212]
[ 0.18532822 0.10837689]
[ 0.21969749 0.97862378]
[ 0.81168315 0.17194101]
[ 0.81622475 0.27407375]
使用randint()生成随机整数:
print(random.randint(0, 100, 10))
这将输出以下数组。请注意,随机数介于 0 到 100 之间,数组的长度为 10。
8 24 67 87 79 48 10 94 52 98
生成 PRNG 分布
正态分布
为了生成高斯值数组,我们将使用normal()函数。
mu, sigma = 10, 2 # mean and standard deviation
print(random.normal(mu, sigma, 10))
6.50046905 10.68536081 12.30607161 9.49512793 11.96264157
11.02843768 10.44235934 7.85991334 9.62100834 10.51000289
二项分布
NumPy 提供了生成各种分布的值的功能,包括二项分布、贝塔分布、帕累托分布、泊松分布等。让我们看看如何从二项分布中生成一些随机数。
假设我们想要模拟 10 次抛硬币的结果。
n, p = 10, .5
s = np.random.binomial(n, p, 5)
这将对 10 次抛硬币进行 5 次不同的试验,并返回每次试验中硬币正面朝上(或反面朝上,由您决定)的次数:
5 4 5 7 1
选择分布
有时,您希望能够从列表中随机选择项目。例如,假设您想在红色(p=0.25)、绿色(p=0.5)和蓝色(p=0.25)之间随机选择。看起来会像这样:
print(random.choice(['red', 'green', 'blue'], 5, p=[0.25, 0.5, 0.25]))
最终的数组如下所示:
'green' 'green' 'green' 'blue' 'red'
您还可以从一系列整数中生成随机选择。
print(random.choice(5, 10, p=[0.2, 0, 0.2, 0.5, 0.1]))
这里,0 发生的概率为 20%,1 发生的概率为 0%,2 发生的概率为 20%,以此类推。结果如下:
3 2 3 3 0 2 3 3 2 3
使用choice()函数,您可以使用频率数据从任意分布创建随机数。
结论
在本指南中,我们介绍了如何利用 NumPy 的随机模块生成 PRN,并简要讨论了伪随机性和真随机性之间的区别。如果您对 NumPy PRNG 函数的工作原理仍有疑问,请查看文档。它提供了如何使用随机模块提供的每个功能的可读示例。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~