【问题标题】:Increase random number set size fairly?公平地增加随机数集大小?
【发布时间】:2013-06-03 19:49:58
【问题描述】:

在我尝试使用一组随机数据作为熵源处理时出现的数学/编程问题。在我使用 Random.org 的 pregenerated random files 之类的东西作为熵源的情况下。像这样的原始数据是随机的 0 和 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% 的可能性。等等。)这会消耗更多数据,但更可预测。

对于我正在尝试做的事情是否有一个术语(不能在 Google 上搜索我无法命名的内容)?是否有可能,或者我是否必须承认我将不得不丢弃与我想要的范围不完全匹配的数据?

【问题讨论】:

    标签: random entropy


    【解决方案1】:

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

    如果你一次使用 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%。

    【讨论】:

    • 这确实减少了浪费,尽管它仅在您需要在同一范围内进行多次抽奖时才有用(在您的示例中为 0-100 抽签 3 次)。我实际使用的是Fisher-Yates shuffle,所以使用的范围在不断变化。但是,如果可以像这样对各种范围进行分组,这可能仍然有效。
    • 计算时只需添加一个存储桶,将三个数字放在其中。使用数字的代码既可以从桶中取一个,也可以调用计算器再取一个。
    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多