这会给随机数带来偏差吗?


11

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

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

这是进行此转换的计划。

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

这将导致从0-9的随机整数字符串

这里是关注点。包含与值10到15对应的4个二进制数字的6个分组的24个二进制数字包含17个1和7个0。这种不平衡会以任何方式影响偶数与奇数整数的分布,还是损害最终的十进制数字字符串的随机性?

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


9
有更有效的方法。例如,您可以将位字符串划分为10个组,将其转换为以10为基数的三位数表示形式,并丢弃任何大于或等于1000的值。这将使用97.6%的位,而不是仅使用62.5%。你不能做得比这更好。(您可以使用681组,并将它们转换为205位以10为基数的字符串,从而使用几乎99.7%的位。)
whuber

Answers:


18

让我们数一看。通过文件的构造,所有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位字符串,并且所有位都是独立的。您的过程构成一种简单的拒绝采样


5
我清楚地看到了这种逻辑。但是,我担心丢弃的二进制1大于0。为什么这种不平衡不会产生任何影响?
Joel W.

5
@JoelW我想我看不到你的论点。最终分配涉及十进制数字,而不是位,因此位的分配无关紧要。
Kodiologist

7
没错,但这只是部分解决了这个问题。为了解决问题的“以任何方式破坏随机性……”部分,还必须确定所得的十进制数字(以极好的近似值)是独立的。为了完整起见,值得为(显而易见的)结果解释一句话。
whuber

7
乔尔,我知道你来自哪里。这里可能会有一个误解:您无法撤消该过程。 如果要从十进制数字流中重建位流,则必须执行一些操作,例如删除所有的8和9,然后将剩余的数字转换为二进制三元组。那将恢复平衡。实际上,很容易看出,这种“往返”就相当于将原始流分成四位半字节,并丢弃它们的最高有效位,从而留下了一个很好的均匀分布的6000万位序列。
whuber

1
@whuber足够公平;添加。
Kodiologist

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")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.