【发布时间】:2015-10-22 05:43:45
【问题描述】:
我正在尝试通过使用 Box–Muller 变换对 Marsaglia 极坐标方法来测试从正态分布生成数字的速度。据说 Marsaglia 极坐标法比 Box-Muller 变换更快,因为它不需要计算 sin 和 cos。但是,当我在 Python 中编写代码时,情况并非如此。有人可以验证这一点或向我解释为什么会这样吗?
def marsaglia_polar():
while True:
x = (random.random() * 2) - 1
y = (random.random() * 2) - 1
s = x * x + y * y
if s < 1:
t = math.sqrt((-2) * math.log(s)/s)
return x * t, y * t
def box_muller():
u1 = random.random()
u2 = random.random()
t = math.sqrt((-2) * math.log(u1))
v = 2 * math.pi * u2
return t * math.cos(v), t * math.sin(v)
【问题讨论】:
-
没有看到你的代码!?
-
我们可以,如果您向我们展示您的代码
-
所以我看到 box_muller 也赢了 10% 到 20%;可能拒绝采样足以使三角函数黯然失色。话虽这么说,如果你足够在意快速完成这种差异对你来说很重要,那么你一开始就不应该在纯 Python 中进行。
-
好吧,公平地说,我在不到一秒的时间内用任何一种方法生成了一百万个随机数。但是,是的,
box_muller赢了 10-15%。似乎大约 25% 的marsaglia_polar运行生成了至少一个s >= 1,这似乎足以输掉比赛。 -
您应该在获得结果时展示结果。我怀疑你会因为应该更快而失分——如果你这样做了,我对你的教授非常失望。衡量事物的全部意义在于找出实际上是什么。
标签: python normal-distribution