runif()函数不是均匀分布。

3

我正在编写一个轮盘赌模拟器,但是卡在了一开始的步骤。我想要从0到36之间随机生成整数,所以我使用了runif()函数。然而我发现0的出现频率异常高。请看下面的代码:

n=1000000
x=floor(runif(n,0,37))
hist(x,breaks=37)

直方图:floor(runif(n,0,37))

为了去除“ 0 ”,我写了以下内容:

n=1000000
x=floor(runif(n,0,37)*100)/100
hist(x,breaks=37)

这是一个直方图:

Histogram: enter image description here

我想知道为什么它能起作用?


1
不,runif 没有问题。请尝试使用 plot(density(x))。问题出在直方图中断点的位置,以及存在一个栅栏帖问题。 - Shape
3
@Shape,将其作为答案发布?(原文意思不明确,需要更多的上下文才能提供更加准确的翻译。) - Ben Bolker
我知道我在另一个问题上写过关于这个的答案...嗯,找到了! - joran
@joran 抱歉,我之前没有找到这篇帖子。感谢您的提醒。 - KryptonLC
我花了几分钟找到了它,并写下了答案! ;) 如果你真的只是想以相等的概率抽样整数,那么你应该考虑使用Ben的建议来使用sample,因为这个函数是专门为此目的设计的。(runif也会给你正确的答案,但sample是人们倾向于使用的...) - joran
1个回答

4
不,这不是runif的问题。
试一下这个: plot(density(x)) 你会看到分布是平滑的。
问题在于直方图中断点的位置,以及存在一个栅栏帖子的问题。直方图不是最好的可视化工具,因为基本上断点必须完全对齐。

谢谢。这意味着我可以假设 floor(runif(n,0,37)) 给我均匀分布的整数,对吗? - KryptonLC
如果你想要查看实际计数,你也可以查看table(x)。它应该是有效的。 - Shape

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接