【发布时间】:2016-01-22 03:35:28
【问题描述】:
在我的嵌入式项目中,我有一个处理任意长度整数的 biginteger 类。我希望能够生成一个介于 0 和任意数字之间的随机 bigint。假设我有一个随机字节的质量来源。
我见过的所有实现基本上都是做同样的事情:
- 用正确的字节数生成一个大数,
- 如果大于最大值,则重新生成。
我看到这个实现的问题是它可能需要很长时间。想象一下max = 2^2049-1 =(01 FF .. FF)。该算法将生成 257 个字节,然后检查最高有效字节是否为<=1。所以它有 254/256 的机会必须生成一个全新的 257 字节数。在(当然不太可能)最坏的情况下,这个循环可能会持续数分钟或数年。
我的问题是:
在生成的数字太大的情况下,有没有办法保留我已经生成的大部分字节?
只重新生成最重要的字节是否有效,还是会引入偏差?将结果右移一位怎么样?
有什么方法可以使时间确定,同时又避免偏差?
--
另一种极端情况:max = 2^2048 + 1 = (01 00 .. 01) 在这种情况下,如果剩余字节为 0,后跟 00 或 01,则最高有效字节可以为非零。因此,大多数情况下,如果 MSB 不为零,则它将无效,并且仅重新生成该字节将永远不会使其有效。但是仅仅强制将其设置为零似乎也是错误的。
【问题讨论】:
-
我不明白只重新生成部分字节会如何引入偏差。您只是用其他随机字节替换一些随机字节。本质上,您的问题归结为选择 0 到 255 之间的 n 个随机数,以及一个范围较小的随机数。对我来说似乎是一个简单而明显的解决方案。另一方面,右移会引入偏差,在您的示例中,您永远不会用 00 或 01 右移数字
标签: random language-agnostic real-time bigint