这会在应该是随机数的情况下引入偏差吗?

机器算法验证 蒙特卡洛 随机生成 随机性
2022-03-13 14:03:43

假设一个随机生成的包含 80+ 百万个 1 和 0 的数据文件。

从这个文件中,我们想要创建一个随机十进制整数列表。

这是进行此转换的计划。

  1. 将 8000 万位数字分成 4 个二进制数字组。
  2. 将每个 4 位二进制转换为十进制。
  3. 丢弃所有大于 9 的十进制值。

这应该会产生一串从 0-9 的随机整数

这就是问题所在。组成对应于值 10 到 15 的 4 个二进制数字的 6 个分组的 24 个二进制数字包含 17 个 1 和只有 7 个零。这种不平衡会影响偶数与奇数的分布,还是会以任何方式损害最终十进制数字串的随机性?

更新:从发布的答案来看,上面列举的方法似乎是合理的。我同意这个结论。但是,我仍然不明白为什么从二进制字符串中删除比零多两倍的数字不会使结果偏向于更少的奇数。我寻求解释。

2个回答

让我们数数看看。通过构建文件,所有 4 位字符串的可能性相同。有 16 个这样的字符串。他们来了:

 0. 0000
 1. 0001
 2. 0010
 3. 0011
 4. 0100
 5. 0101
 6. 0110
 7. 0111
 8. 1000
 9. 1001
10. 1010
11. 1011
12. 1100
13. 1101
14. 1110
15. 1111

您的程序会抛出字符串 10 到 15。因此,在您实际使用的情况下,您将选择 0 到 9,根据需要,每一个都具有相同的可能性。我们知道生成的十进制数字是相互独立的,因为每个数字都使用一个单独的 4 位字符串,并且所有位都是独立的。你的程序构成了一种简单的拒绝抽样

没有偏差,因为您只是模拟了一些被丢弃的值,并且所有值(包括保留的值)都以相同的概率生成: 在此处输入图像描述

上图的 R 代码是

generza=matrix(sample(0:1,4*1e6,rep=TRUE),ncol=4)
uniz=generza[,1]+2*generza[,2]+4*generza[,3]+8*generza[,4]
barplot(hist(uniz[uniz<10],breaks=seq(-0.5,9.5,le=11))$counts,col="steelblue")