公平地增加随机数集的大小?

时间:2013-06-03 19:49:58

标签: random entropy

在我尝试使用一组随机数据作为熵源时出现的数学/编程问题。在我使用Random.org的pregenerated random files之类的东西作为熵源的情况下。像这样的原始数据是随机零和1,可以作为随机字节(0-255)或更大范围作为2的幂。我试图在使用这个随机源时尽可能高效,因为它的长度是有限的,所以我不想使用比我需要的更大的集合。

如果你想要一个可被256整除的范围内的数字(例如100到355,0到15等),那么随机字节是公平的。但是,如果我想要一个从1到100的数字怎么办?这在256中不合适。我可以将0-199分配到1-100范围两次,留下200-255作为额外的,如果绘制则必须丢弃,否则该范围内的55个数字将被不公平地加权更频繁地出现。

抛出超出范围的数字是唯一公平的选择吗?或者是否有一种数学方法可以在1-100范围内“模糊”那55个数字?

我想出的唯一另一个选择是知道我将能够使用数字而不是丢弃结果是吸收更多的字节,因此偏差程度较小(0-255会有一些数字在1-100有两个“抽奖”,有些有三个; 3:2赔率= 50%更可能。十个字节(0-2,550)将有26:25赔率= 4%更可能。等等。)这会占用更多数据,但更具可预测性。

我正在尝试做什么(不能谷歌,我不能命名)?是否可能,或者我是否必须承认我将不得不丢弃与我想要的范围不相符的数据?

1 个答案:

答案 0 :(得分:1)

如果每个数字使用7位,则得到0-127。每当你得到一个大于100的数字时,你必须丢弃它。您丢失了该数据点的使用但仍然是随机的。每128个中有28个或大约20%的随机信息丢失。

如果您在敲击时使用20位,则会得到介于0和1,048,575之间的数字。这可以分为0到99之间的3个随机值(如果加1则为1-100)。在分割时,你必须使用整数运算或丢弃任何小数部分。

if (number > 1000000) discard it.
a = number % 100;
b = (number / 100) % 100;
c = (number / 10000) % 100;

您只会浪费1048575中的48,575个值或约5%的随机信息。

你可以这样想到这个过程。通过将20位转换为十进制整数来获取您获得的数字。打破10和1的数字,1000和100的数字以及100,000和10,000的数字,并将它们用作三个随机数。它们是真正随机的,因为这些数字可能是原始数字中的任何值。此外,我们放弃了任何偏向三者特定值的值。

因此,有一种方法可以更有效地使用随机位。但你必须做一些计算。

注意:下一个有趣的位组合是27位,浪费了大约25%。 14位会浪费大约60%。