为了账号安全,请及时绑定邮箱和手机立即绑定

随机索引分布怪异

随机索引分布怪异

Go
侃侃无极 2022-01-10 15:13:12
我偶然发现了这一点,试图从一些数据中做一个随机有偏差的样本。我正在寻找适合 x^2 的简单分布,但是这里有一个人工制品,我无法完全理解。这是一个 for 循环的片段,在 x^2 分布的数组中选择一个索引,然后在该索引位置递增计数器。package mainimport "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)}无论边界或迭代次数如何,绘制图形总是看起来像这样,最后有一个明显的“下降”。这是我很难理解的。指数不应该一直符合曲线吗?我怀疑与四舍五入有关的事情,但我现在正在寻找稻草。
查看完整描述

2 回答

?
慕运维8079593

TA贡献1876条经验 获得超5个赞

问题是您的分布范围为 [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]


查看完整回答
反对 回复 2022-01-10
?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

首先,您的 X 比例具有误导性,因为它从 1 开始并以 10 结束。应该是 0...9。

考虑到它会被修复,你的分布是完全正确的,尽管可能不是有意的(你真正想要什么?)。

您首先有一个介于 0 和 9 之间的分布,两者都包括在内。如果你加 0.5 然后向下取整,问问自己每个索引可以实际“获得”多少次点击?

:大多数索引都得到一个“完整集”,其十进制值介于 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 之间。

图表的左端实际上比您可能预期的要低,尽管它不像右端那样可区分。

这些数字有时确实令人惊讶:-)。


查看完整回答
反对 回复 2022-01-10
  • 2 回答
  • 0 关注
  • 116 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信