我正在寻找一种有效的算法,可以生成一定范围内的随机值,而不重复。
在伪代码中:(在 Rand 类中)
Rand(long from, long to) {
this.from = from;
this.to = to;
// ...
}
long getNumber() {
// returns a random number in the [from, to] range
// which has never been returned before
}
Usage:
Rand r = new Rand(1, 100000000);
long x = r.getNumber();
long y = r.getNumber();
...
从 r.getNumber() 返回的数字应该始终与之前返回的数字不同。
当然,如果to - from + 1
返回数字后,算法应该重新开始(或者出错 - 无论如何都不重要)。
请注意,范围可能非常大,因此是随机排列的数组(最初包含[from, to]
数字)可能会溢出内存。
密码是一对一的映射,否则无法解密。因此,任何块密码都会将数字 0、1、2、3、4、5...映射到不同的 n 位数字,其中 n 是密码的块大小(以位为单位)。
将简单的 4 轮 Feistel 密码与您想要的任何(偶数)块大小组合在一起相对容易。只有四轮,速度很快,但不安全。或者使用仓促布丁密码它几乎可以有你想要的任何块大小。
无论您使用哪种密码,只需加密数字 0、1、2...,然后查看输出块即可。您可以丢弃任何超出您所需范围的结果,并且所有结果都保证是唯一的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)