【发布时间】:2017-03-16 20:45:36
【问题描述】:
问题
我需要一次在 0 到 10,000,000,000 之间选择一个唯一的随机数,并一直这样做直到选择了所有数字。本质上,我需要的行为是一个预先构建的堆栈/队列,其中包含 100 亿个随机数字,无法将新项目推入其中。
不太好的解决方法:
我的大脑中不乏低效的方法。比如,
- 持久化生成的数字并检查新生成的随机数是否已被使用,在某些时候这会让我们无限期地等待生成可用的数字。
- 将所有可能的数字保留在一个表中并弹出一个随机行并为下一次选择等保持新的行数。不确定这是好是坏。
问题:
-
除了存储所有可能的组合并使用随机数之外,还有其他确定性方法吗?
- 喜欢维护可用数字的窗口并首先随机选择一个窗口并在该窗口内随机选择一个数字等。例如:如this
-
如果不是,在相当小的空间中存储数字的最佳类型是什么?
- 50+% 的数字不适合 32 位 (int),64 位 (long) 是浪费。 Cos 最大数字适合 34 位,每个数字浪费 30 位(总共 >37GB)。
如果这个问题还没有解决。
- 什么是存储和选择随机点并快速调整结构以便下一个选择更快的良好数据结构?
***抱歉,含糊不清。最大可选数为 9,999,999,999,最小可选数为 1。
【问题讨论】:
-
随机性必须有多完美?您是否需要所有 100 亿个因子排列的可能性相同?
-
您想要 1 到 100 亿还是 0 到 100 亿之间的数字?标题说明一件事,问题说明另一件事。
-
您需要 lg((10^10)!) 位来存储 10b 数字的所有可能排列,因此... 4,584,883,940 位 -> 547MB。因此,对于完全随机性,这是您的 最小 #2 空间。
-
@ruakh 随机性不必完全完美。
标签: algorithm search memory-management random