Python中正态分布生成数

2024-10-02 08:26:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试用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)

Tags: 方法boxlogreturndefrandommathsqrt
1条回答
网友
1楼 · 发布于 2024-10-02 08:26:28

为了“好玩”,我把它写在围棋里。box_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()
}

输出:

^{pr2}$

相关问题 更多 >

    热门问题