我偶然发现了这一点,试图从一些数据中进行随机偏差样本。看来我正在寻找适合 x^2 的简单分布,但这里有一个我无法完全理解的人工制品。
下面是一个 for 循环的片段,在按 x^2 分布的数组中选择一个索引,然后递增该索引位置处的计数器。
package main
import "time"
import "fmt"
import "math"
import "math/rand"
func main() {
rand.Seed(time.Now().UTC().UnixNano())
var arr [10]int
for i := 0; i < 5000; i++ {
rnd := rand.Float64()
tmp := rnd * rnd * 9
index := int(math.Floor(tmp + .5))
arr[index]++
}
fmt.Printf("%v", arr)
}
无论边界或迭代次数如何,绘制值的图形总是看起来像这样,最后有明显的“下降”。
这是我难以理解的。索引不应该完全符合曲线吗?
我怀疑与四舍五入有关的事情,但我现在正在捕获救命稻草。
最佳答案
问题是你的分布的范围是 [0,1],然后你将其乘以 9,得到范围 [0,9],然后加上 0.5,得到范围 [0.5, 9.5]。
不仅最后一个索引值有明显下降,第一个索引值也有不明显的下降,因为每个桶只装了一半。
您是否考虑过简单地乘以 10 而不是 9
tmp := rnd * rnd * 10
然后在你的楼层中留下+ 0.5?
index := int(math.Floor(tmp))
这会产生如您所期望的分布,以下是循环达到 500,000 的一些结果:
[157949 65411 50239 42599 37637 33706 31200 28789 26927 25543]
[158302 65533 49712 42480 37347 33882 30987 28696 27225 25836]
[157824 65627 50432 42328 37307 33900 30787 29006 26975 25814]
关于随机索引分布怪异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37196340/