【问题标题】:Generating random uniform random numbers from coin flip algorithm tends to generate more 0s than expected从硬币翻转算法生成随机均匀随机数往往会生成比预期更多的 0
【发布时间】:2019-12-28 03:18:39
【问题描述】:

我正在尝试使用函数rcoin 生成0 到99 范围内的随机数,该函数以相等的概率返回0 或1。我编写了以下代码,将连续调用rcoin函数生成的二进制数转换,然后在数字小于100的条件下返回它。这是R代码。

rcoin <- function() {
  rbinom(n = 1, size = 1, prob = 0.5)
}

r100 <- function(n=100) {
  v = n + 1
  while(v > n) {
    v = sum(sapply(0:6, function(i) rcoin() * 2 ^ i))
  }
  v
}

val_plot <- function() {
  N = 10000
  rand_sample <- rep(0, N)
  for (i in 1:N){
    rand_sample[i] = r100()
  }
  hist(rand_sample, breaks = 100)
}

val_plot() 

它应该产生从 0 到 99 的均匀随机数,因为截断的均匀分布也是均匀的。但是当我绘制 10000 个生成值的直方图时,我看到值 0 生成的次数异常多,但所有其他值都遵循均匀分布。为什么?我猜这是因为二进制数“1111111”被拒绝,而“0000000”没有。但是我该如何解决这个问题?有什么办法可以改善吗?

【问题讨论】:

  • 我还没有完全破解它,但我认为这是使用hist 的问题,而不是你的函数的属性。尝试将 hist(rand_sample, breaks = 100) 替换为 table(rand_sample) 以查看表格输出。我没有看到 0 的峰值,但您会注意到它包含 100 的输出。要解决此问题,您可以将 while(v &gt; n) { 替换为 while(v &gt;= n) {,以便拒绝 100 的值。

标签: r random coin-flipping


【解决方案1】:

这归结为hist 的使用问题,而不是函数本身。 解决方法:

1) 将while(v &gt; n) { 替换为while(v &gt;= n) {,因此我们生成低于100 的数字并拒绝100 或更高的数字。否则r100 的输出范围是 0 到 100,而不是 0 到 99。

2) 将hist(rand_sample, breaks = 100) 替换为hist(rand_sample, breaks = 0:100, right = F)。否则,默认的hist 设置会将 0 和 1 分箱,并使第一个箱看起来太大。

我们也可以从简单的内置均匀分布中看到这种行为。

hist(floor(runif(1E6, min = 0, max = 100)), breaks = 100)

hist(floor(runif(1E6, min = 0, max = 100)), breaks = 0:100, right = F)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 2010-12-04
    相关资源
    最近更新 更多