【问题标题】:most efficient way to guarantee uniqueness when generating a large amount of random numbers [duplicate]生成大量随机数时保证唯一性的最有效方法[重复]
【发布时间】:2017-11-11 23:58:44
【问题描述】:

我需要生成一个代表 v4 ip 地址的随机数数组,并且数组中的每个随机数都必须是唯一的。

解决这个问题的最有效方法(数据结构和算法)是什么?

我正在考虑生成一个 255^4 元素的数组,从 0 到 255^4。并使用 Fischer 和 Yattes 算法等洗牌算法对这些数字进行洗牌。所以当我需要生成一个 n 元素的数组时,我只需从上面的数组中选择第一个 n 元素。

这是最有效的方法吗?

【问题讨论】:

标签: java random shuffle


【解决方案1】:

IP v4 数字只是表示 32 位整数的另一种方式。以十进制打印每个字节,中间带有点。

因此,选择一个随机的 32 位数字,并丢弃那些代表系统中广播地址的数字。根据需要重复。

【讨论】:

    【解决方案2】:

    如果您想要 IPv4 整数(32 位)的确定性唯一性保证,您可以简单地使用一个 512 MB 的数组,然后根据您需要的任何概率分布在数组上循环,掷硬币(可能偏向于多少您正在寻找的整数),如果是正面则设置该位,如果是反面则不设置。

    但是,如果您只愿意提供概率保证,则使用基于 approximate counting 的构造来减少内存消耗可能会更加棘手。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-19
      • 1970-01-01
      • 2018-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多