使用 NumPy 实现几乎随机的数字和分布

发布日期:2026-07-19 09:09:03  来源 : 杭州电子商务研究院    浏览量 :0
杭州电子商务研究院 发布日期:2026-07-19 09:09:03  
0

介绍

随机数被认为是计算领域的一种“圣杯”。随机性似乎很难捉摸;当代处理器很难生成真正的随机数。然而,随机性在各种实际应用中都至关重要。大多数现代加密方法都依赖于真正随机数的生成(例如,一束熔岩灯如何保护我们免受黑客攻击)。

对于我们这些不需要自然现象的真正随机性的人来说,有一个足够好的替代方案:伪随机数 (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 函数的工作原理仍有疑问,请查看文档它提供了如何使用随机模块提供的每个功能的可读示例。

以上内容来自杭州电子商务研究院推送
分享到:

长按或扫码识别 分享给好友

长按或扫码识别 分享给好友
关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
Copyright © 2025-2027 ToB产业网址导航 公安备案 浙公网安备33010602013138号 浙ICP备16025413号-9
支持 反馈 关注 数据