在Python中从正态分布生成数字

用户名

我试图通过使用针对Marsaglia极坐标法的Box-Muller变换来测试从正态分布生成数字的速度。据说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)
约书亚·格里戈尼斯(Joshua Grigonis)

为了“有趣”,我在旅途中写下了它。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()
}

输出:

marsaglia_polar duration =  104.308126ms
box_muller duration      =  88.365933ms

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

python中的对数正态分布

来自分类Dev

在python中创建正态分布

来自分类Dev

按顺序生成正态分布python,numpy

来自分类Dev

如何基于python中的模式生成数字

来自分类Dev

使用Python生成100 X 100随机矩阵,其条目是从正态分布中采样的

来自分类Dev

Scala:如何根据预期分布生成数字?

来自分类Dev

从Java中的数组生成对数正态分布

来自分类Dev

在R中的某些限制内生成正态分布

来自分类Dev

从Java中的数组生成对数正态分布

来自分类Dev

Java-实现随机向量生成器,该生成器生成正态分布的数字

来自分类Dev

生成数字序列

来自分类Dev

“生成数字”难题

来自分类Dev

如何在Python中采样多元对数正态分布?

来自分类Dev

如何在Python中创建logit正态分布?

来自分类Dev

如何在Matlab中生成遵循正态分布但写入时间的数字

来自分类Dev

Python-计算正态分布

来自分类Dev

Python-计算正态分布

来自分类Dev

在Matlab中绘制正态分布

来自分类Dev

如何从正态分布中采样?

来自分类Dev

在python pandas dataframe中遇到值时如何生成数字序列

来自分类Dev

如何在Python的列表列表中从字符串中生成数字列表

来自分类Dev

估计从中采样数字的正态分布参数

来自分类Dev

如何生成整数的随机正态分布

来自分类Dev

从正态分布生成许多样本对

来自分类Dev

在R中生成偏态正态分布

来自分类Dev

如何使用Elasticsearch生成数字属性的分位数分布?

来自分类Dev

如何在python中生成数字的随机序列?

来自分类Dev

生成数字字符串python

来自分类Dev

Python新手尝试递归生成数字模式