我偶然发现了这一点,试图从一些数据中做一个随机偏差的样本。似乎是一个适合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)
}
无论迭代的界限或数量如何,绘制值的图表总是看起来像这样,带有明显的&#34; drop&#34;最后。
这是我无法理解的。索引不应该一直适合曲线吗?
我怀疑与四舍五入有关的事情,但我现在正抓住吸管。
答案 0 :(得分:4)
问题是你的分布范围是[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]
答案 1 :(得分:1)
首先,你的X-scale是误导性的,因为它从1开始到10结束。应该是0 ... 9.
考虑到它会被修复,你的分发是完全正确的,虽然可能没有意图(你真正想要的是什么?)。
您首先在0到9之间进行分配,包括两者。如果您添加0.5然后向下舍入,请问自己每个指数可以“获得”的点击次数?
A :大多数索引获得“完整设置”,其中十进制值介于1和2(或6和7,或任何其他间隔)之间,后者向下舍入到1(或6,或任何索引)
<强>除非强>
边缘索引 0和9仅获得“半满设置”。
因为偏移索引0 ... 1到0.5 ... 1.5并向下舍入。然后,此范围的一半将保留为index = 0,即。值介于0.5和1之间(因为0到0.5之间不再有任何值)。
与另一端相同。你将8 ... 9偏移到8.5 ... 9.5然后向下舍入。指数9只获得1/2,即。值介于9和9.5之间。
图表的左端实际上低于您的预期,尽管它与右端没有区别。
这些数字确实有时令人惊讶: - )。