猿问

随机索引分布怪异

我偶然发现了这一点,试图从一些数据中做一个随机有偏差的样本。我正在寻找适合 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)

}

无论边界或迭代次数如何,绘制图形总是看起来像这样,最后有一个明显的“下降”。

这是我很难理解的。指数不应该一直符合曲线吗?

我怀疑与四舍五入有关的事情,但我现在正在寻找稻草。


侃侃无极
浏览 117回答 2
2回答

慕运维8079593

问题是您的分布范围为 [0,1],然后将其乘以 9,得到范围 [0,9],然后加上 0.5,得到范围 [0.5, 9.5]。不仅最后一个索引值有明显下降,第一个索引值也有不明显下降,因为每个桶只装了一半。您是否考虑过简单地乘以 10 而不是 9tmp := 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]

呼啦一阵风

首先,您的 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 之间。图表的左端实际上比您可能预期的要低,尽管它不像右端那样可区分。这些数字有时确实令人惊讶:-)。
随时随地看视频慕课网APP

相关分类

Go
我要回答