繁体   English   中英

从硬币翻转算法生成随机均匀随机数倾向于生成比预期更多的 0

[英]Generating random uniform random numbers from coin flip algorithm tends to generate more 0s than expected

我正在尝试使用以相等概率返回 0 或 1 的函数rcoin生成 0 到 99 范围内的随机数。 我编写了以下代码,将连续调用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的使用问题,而不是函数本身。 解决:

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

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

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

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

在此处输入图片说明

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

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM