【问题标题】:Random Number Generator Explanation随机数发生器说明
【发布时间】:2014-11-20 18:29:53
【问题描述】:
from random import *
def main():
    t = 0
    for i in range(1000):  # thousand
        t += random()
    print(t/1000)
main()

我正在查看教授给我的示例程序的源代码,结果发现了这个 RNG。谁能解释这个RNG是如何工作的?

【问题讨论】:

  • 如果您正在寻找高斯/正态分布,这一点也不傻。
  • @RussellBorogove 实际上它非常愚蠢。这是概率/统计等价于将两个大数 A 和 B 相加,将 A 添加到自身 B 次。有比将一千个制服相加更好的方法来获得高斯。
  • 你的教授似乎是一个很好的人选,可以解释他写的代码:)
  • @pjs - 也许随机数生成不是本练习的目标。也许目标是别的东西,而 Valus 并没有说明。它在学期初期,所以我希望这是一个使用控制语句和算术的练习。不过,我可能是错的。
  • @jww 有很多例子可以证明这些事情要好得多。即使这个想法是为了展示中心极限定理,您也可以通过添加 2 个制服或 3 个制服几乎立即看到它,而循环到 12 并减去 6 会得到非常接近标准法线的结果。 1000 纯粹是浪费计算周期。

标签: python for-loop python-3.x random operators


【解决方案1】:

查看文档。它写得很好: https://docs.python.org/2/library/random.html

这个想法是该程序生成一个随机数 1000 次,足以将平均值设为 0.5

【讨论】:

    【解决方案2】:

    使这个随机的东西是被调用的 random() 函数。 random() 将在 0 和 1 之间生成 1 个(对于大多数实际目的)随机浮点​​数。

    >>>random()
    0.1759916412898097
    >>>random()
    0.5489228122596088
    

    等等

    剩下的只是将每个随机数加到总数中,然后除以随机数,基本上找到所有 1000 个随机数的平均值,正如 Cyber​​ 指出的那样,这实际上根本不是随机数。

    【讨论】:

      【解决方案3】:

      如果您绘制这些点,您会发现这实际上产生了一个关于随机函数均值的高斯(“正态”)分布。

      Generate random numbers following a normal distribution in C/C++谈随机数生成;如果您所拥有的只是标准 C 中的统一数字生成器,那么这是一种非常常见的技术。

      我在这里为您提供的是从您的函数中提取的 100,000 个值的直方图(当然,如果您不熟悉 python,则返回未打印)。 y 轴是值出现的频率,x 轴是值的 bin。如您所见,平均值为 1/2,而 3 个标准差(数据的 99.7%)我们几乎没有该范围内的值。那应该是直观的;我们“通常”得到 1/2,很少得到 .99999

      【讨论】:

      【解决方案4】:

      该程序使用Central Limit Theorem - 具有有限方差的独立同分布随机变量X 的总和渐近收敛到正态(又名高斯)分布,其均值是均值的总和,方差是总和的方差。将其按 N 缩放,X 的总和数得出样本均值(也称为平均值)。如果X的期望值为μ,X的方差为σ2,则样本均值的期望值为μ,方差为σ2 / N.

      由于 Uniform(0,1) 的平均值为 0.5,方差为 1/12,因此您的算法将生成非常接近正态分布的结果,平均值为 0.5,方差为 1/12000。因此,99.7% 的结果应在平均值的 +/-3 个标准差范围内,即在 0.5+/-0.0274 范围内。

      这是一种非常低效的生成法线的方法。更好的替代方法包括Box-Muller 方法、Polar 方法或ziggurat 方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-16
        • 2011-01-23
        • 2019-12-15
        相关资源
        最近更新 更多