具有给定概率的 slice/数组的 Golang 选择数

标签 go probability

你好,我正在寻找一种方法来从具有给定概率向量的数组/slice 中选择数字,例如: 我们有数据 [0,1,2] 和概率向量 [0.2,0.5,0.3] 所以我们选择 0 的概率为 0.2,1 的概率为 0.5,2 的概率为 0.3 在 python 中我会使用 numpy.random.choice 。但我不知道在 Go 中该怎么做 我可以使用 0-100 之间的随机数,然后使用 if's 做一些事情,比如如果数字是 0-20 那么它的 0 和其他人的方式相同。但我认为有更好的方法可以做到这一点,并且更通用地将它作为功能来实现。

最佳答案

解决方案就是根据给定的概率 (pdf) 计算 cdf,然后找到正确的桶:

func sample(cdf []float32) int {
    r := rand.Float32()

    bucket := 0
    for r > cdf[bucket] {
        bucket++
    }
    return bucket
}

获取cdf是通过

func main() {
    // probability density function
    pdf := []float32{0.3, 0.4, 0.2, 0.1}

    // get cdf
    cdf := []float32{0.0, 0.0, 0.0, 0.0}
    cdf[0] = pdf[0]
    for i := 1; i < 4; i++ {
        cdf[i] = cdf[i-1] + pdf[i]
    }

    // test sampling with 100 samples
    samples := []float32{0.0, 0.0, 0.0, 0.0}

    for i := 0; i < 100; i++ {
        samples[sample(cdf)]++
    }

    // normalize
    for i := 0; i < 4; i++ {
        samples[i] /= 100.
    }

    fmt.Println(samples)
    fmt.Println(pdf)

}

完整示例: https://play.golang.org/p/ceZx1EiYW3l

sample 的输出遵循给定的概率:

samples: [0.33 0.43 0.15 0.09]
pdf: [0.3 0.4 0.2 0.1]

关于具有给定概率的 slice/数组的 Golang 选择数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50507513/

相关文章:

go - 如何用 Golang 解密 AES 加密的传输流段?

go - 无法按键获取 gorilla session 值

goji/httpauth - 不能与标准 Golang 'net/http' 库一起使用

java - 骰子统计程序

c++ - 如何正确散列自定义结构?

algorithm - 无放回和负权重的加权抽样

neural-network - 焦点损失实现

go - 使用Sarama单独或批量提交消息-Go的kafka客户端

sorting - 在某些条件下快速排序中分区中的最小部分?

go - 在端点 REST API 的 GoConvey 测试期间跳过某些包含静态内容的文件夹