我正在写一些List<int>
从非常慢的远程随机数生成源读取字节(只是 a )的东西。为此和我的个人要求,我想从源中检索尽可能少的字节。
现在我正在尝试实现一个签名看起来像的方法:
int getRandomInteger(int min, int max)
我有两种理论如何从我的随机源中获取字节,并将它们转换为整数。
方法#1 是幼稚的。获取(max - min) / 256
字节数并将它们相加。它可以工作,但它会从我拥有的慢速随机数生成器源中获取大量字节。例如,如果我想获得一百万到零之间的随机整数,它将获取近 4000 个字节......这是不可接受的。
方法 #2 对我来说听起来很理想,但我无法提出算法。它是这样的:
让我们以 min: 0, max: 1000 为例。
- 计算
ceil(rangeSize / 256)
在这种情况下是ceil(1000 / 256) = 4
。现在从源中获取一 (1) 个字节。 - 将此字节从 0-255 范围缩放到 0-3 范围(或 1-4),并让它确定我们使用哪个组。例如,如果字节为 250,我们将选择第 4 组(代表最后 250 个数字,在我们的范围内为 750-1000)。
- 现在获取另一个字节并从 0-255 缩放到 0-250 并让它确定我们在组中的位置。因此,如果第二个字节是例如 120,那么我们的最终整数是
750 + 120 = 870
。
在那种情况下,我们总共只需要获取 2 个字节。然而,如果我们的范围是 0-1000000,我们需要几个“组”,这要复杂得多。
我该如何实现这样的事情?我可以使用 Java/C#/JavaScript 代码或伪代码。
我还想保持结果不会丢失熵/随机性。所以,我有点担心缩放整数。