Python中正态分布生成数
我试图通过使用Box-Muller变换和Marsaglia极坐标法来测试正态分布生成数字的速度。据说Marsaglia极坐标法被认为比Box-Muller变换更快,因为它不需要计算正弦和余弦。然而,当我用Python编写代码时,情况并非如此。有人能证实这一点或向我解释为什么会发生这种情况吗Python中正态分布生成数,python,normal-distribution,Python,Normal Distribution,我试图通过使用Box-Muller变换和Marsaglia极坐标法来测试正态分布生成数字的速度。据说Marsaglia极坐标法被认为比Box-Muller变换更快,因为它不需要计算正弦和余弦。然而,当我用Python编写代码时,情况并非如此。有人能证实这一点或向我解释为什么会发生这种情况吗 def marsaglia_polar(): while True: x = (random.random() * 2) - 1 y = (random.random(
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)
def marsaglia_polar():
尽管如此:
x=(random.random()*2)-1
y=(random.random()*2)-1
s=x*x+y*y
如果s<1:
t=数学sqrt(-2)*数学日志/s
返回x*t,y*t
def box_muller():
u1=随机。随机()
u2=随机。随机()
t=math.sqrt(-2)*math.log(u1))
v=2*math.pi*u2
返回t*math.cos(v),t*math.sin(v)
为了“好玩”,我在围棋中写下了它。那里的box\u muller
功能也更快。而且,它的速度大约是python版本的10倍
package main
import (
"fmt"
"math"
"math/rand"
"time"
)
func main() {
rand.Seed(time.Now().UnixNano())
now := time.Now()
for i := 0; i < 1000000; i++ {
marsaglia_polar()
}
fmt.Println("marsaglia_polar duration = ", time.Since(now))
now = time.Now()
for i := 0; i < 1000000; i++ {
box_muller()
}
fmt.Println("box_muller duration = ", time.Since(now))
}
func marsaglia_polar() (float64, float64) {
for {
x := random() * 2 - 1;
y := random() * 2 - 1;
s := x * x + y * y;
if s < 1 {
t := math.Sqrt((-2) * math.Log(s)/s);
return x * t, y * t
}
}
}
func box_muller() (float64, float64) {
u1 := random()
u2 := random()
t := math.Sqrt((-2) * math.Log(u1))
v := 2 * math.Pi * u2
return t * math.Cos(v), t * math.Sin(v)
}
func random() float64 {
return rand.Float64()
}
没有看到你的代码!?我们可以,如果你给我们看你的代码,那么我看到博斯穆勒以10%到20%的优势获胜;可能拒绝采样的减速足以掩盖触发功能。这就是说,如果你足够关心这样做的速度,那么这种差异对你来说很重要,你首先不应该在纯Python中这样做。但是是的,
box\u muller
以10-15%的优势获胜。似乎大约25%的marsaglia_polar
运行至少生成一个s>=1
,这似乎足以造成损失。您应该在获得结果时展示您的结果。我怀疑你会因为本该更快的东西而失分——如果你这样做了,我对你的教授非常失望。衡量事物的全部意义在于找出事实真相。
marsaglia_polar duration = 104.308126ms
box_muller duration = 88.365933ms