Rin*_*g Ø 1 random algorithm non-repetitive
我正在寻找一种有效的算法,可以在一个范围内产生随机值,而不需要重复.
在伪代码中:(在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
}
Run Code Online (Sandbox Code Playgroud)
用法:
Rand r = new Rand(1, 100000000);
long x = r.getNumber();
long y = r.getNumber();
...
Run Code Online (Sandbox Code Playgroud)
从r.getNumber()返回的数字应始终与先前返回的数字不同.
当然,如果to - from + 1返回数字,算法应该重新开始(或者错误 - 不管怎么说都不重要).
注意,范围可能非常大,因此随机排列的数组(最初包含[from, to]数字)可能会溢出存储器.
密码是一对一映射,否则无法解密.因此,任何块密码都会将数字0,1,2,3,4,5 ......映射到不同的n位数,其中n是以比特为单位的密码块大小.
将一个简单的4轮Feistel cypher与你想要的任何(偶数)块大小放在一起相对容易.只有四轮,它会很快但不安全.或者使用Hasty Pudding cypher,它可以拥有你想要的几乎任何块大小.
无论你使用什么密码,只需加密数字0,1,2 ......,然后查看输出块.您可以丢弃超出所需范围的任何结果,并保证所有结果都是唯一的.