Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
给定概率切片/数组中的Golang选择数_Go_Probability - Fatal编程技术网

给定概率切片/数组中的Golang选择数

给定概率切片/数组中的Golang选择数,go,probability,Go,Probability,您好,我正在寻找一种从给定概率向量的数组/切片中选择数字的方法,例如: 我们有数据[0,1,2]和概率向量[0.2,0.5,0.3] 所以我们选择概率为0.2的0,概率为0.5的1,概率为0.3的2 在python中,我将使用numpy.random.choice。但我不知道在围棋里怎么做 我可以使用0-100之间的随机数,然后用if来做一些事情,比如如果数字是0-20,那么它是0,其他人也是这样。但我认为有更好的方法来实现它,也有更通用的方法来实现它 解决方案只是根据给定概率(pdf)计算cd

您好,我正在寻找一种从给定概率向量的数组/切片中选择数字的方法,例如: 我们有数据[0,1,2]和概率向量[0.2,0.5,0.3] 所以我们选择概率为0.2的0,概率为0.5的1,概率为0.3的2 在python中,我将使用numpy.random.choice。但我不知道在围棋里怎么做
我可以使用0-100之间的随机数,然后用if来做一些事情,比如如果数字是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)

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