【发布时间】:2017-11-11 23:58:44
【问题描述】:
我需要生成一个代表 v4 ip 地址的随机数数组,并且数组中的每个随机数都必须是唯一的。
解决这个问题的最有效方法(数据结构和算法)是什么?
我正在考虑生成一个 255^4 元素的数组,从 0 到 255^4。并使用 Fischer 和 Yattes 算法等洗牌算法对这些数字进行洗牌。所以当我需要生成一个 n 元素的数组时,我只需从上面的数组中选择第一个 n 元素。
这是最有效的方法吗?
【问题讨论】:
我需要生成一个代表 v4 ip 地址的随机数数组,并且数组中的每个随机数都必须是唯一的。
解决这个问题的最有效方法(数据结构和算法)是什么?
我正在考虑生成一个 255^4 元素的数组,从 0 到 255^4。并使用 Fischer 和 Yattes 算法等洗牌算法对这些数字进行洗牌。所以当我需要生成一个 n 元素的数组时,我只需从上面的数组中选择第一个 n 元素。
这是最有效的方法吗?
【问题讨论】:
IP v4 数字只是表示 32 位整数的另一种方式。以十进制打印每个字节,中间带有点。
因此,选择一个随机的 32 位数字,并丢弃那些代表系统中广播地址的数字。根据需要重复。
【讨论】:
如果您想要 IPv4 整数(32 位)的确定性唯一性保证,您可以简单地使用一个 512 MB 的数组,然后根据您需要的任何概率分布在数组上循环,掷硬币(可能偏向于多少您正在寻找的整数),如果是正面则设置该位,如果是反面则不设置。
但是,如果您只愿意提供概率保证,则使用基于 approximate counting 的构造来减少内存消耗可能会更加棘手。
【讨论】: