【问题标题】:How to select nth random integer from a range of integers without repetition or storage? [duplicate]如何从整数范围中选择第 n 个随机整数而不重复或存储? [复制]
【发布时间】:2023-03-04 23:17:02
【问题描述】:

假设我的系统需要定期提供一个唯一的整数 id,介于 1 和 10^20 之间,来自类似 --

的函数
function getNextRandomUniqueId(index:BigInt, min:BigInt, max:BigInt, seed:BigInt): BigInt { ? }

id = getNextRandomUniqueId(index=42, min=1, max=10^20, seed=0)

这些 id 需要随着索引的增加以随机顺序提供,而不是按顺序提供。一旦提供了 id,就不能再次提供,只要索引增加。我的系统无法存储所有要发行的号码的随机列表,或者所有发行的号码,太多了。我也不想依赖诸如随机 UUID 之类的东西,它极不可能发生冲突,但不能保证。

如何做到这一点?有一种确定性的数学方法来随机迭代一组连续整数而不重复和不存储?

编辑:将 1^20 固定为 10^20

【问题讨论】:

  • 我想你的意思是 10^20? 1^20 是 1。

标签: algorithm math random integer


【解决方案1】:

这可以做到,前提是您被允许存储加密密钥和计数器。加密是一对一的映射,因此通过加密给定范围内的所有数字,您将以随机顺序返回所有相同的数字。不同的键会给出不同的顺序。使用密钥按顺序加密数字 0、1、2、3、...,并记录您的距离。

根据数字的范围,您可能需要使用某种形式的Format Preserving encryption 以将输出保持在所需范围内。

【讨论】:

    【解决方案2】:

    你不能保证你的同一个 id 不在另一个种子序列中。

    当您自己不提供种子时,大多数语言都会使用时间来生成序列。您已将种子设置为零,因此每次重新启动程序时,您都会获得相同的 ID。这很可能不是你的意图:-)

    但即使您这样做,您也有可能遇到相同的 id。 100,000,000,000,000,000,000 个中的 1 个。

    之所以能得到相同的id是因为它是随机的

    我会选择 GUID。 1 在 340.280.000.000.000.000.000.000.000.000.000.000.000

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-23
      • 1970-01-01
      • 2018-06-22
      • 2019-08-09
      • 1970-01-01
      • 2020-05-28
      • 2013-11-07
      相关资源
      最近更新 更多