我需要在java中生成80位随机数(非非重复)。
我该怎么做?
我计划使用当前的时间戳来做到这一点。这给了我8个字节,休息了2个字节。我可以添加其他内容....请让我知道您的意见,我该怎么做...
或者如果您有任何其他想法来实现相同的...
请考虑系统重启案例
答案 0 :(得分:3)
尝试结合使用Random#nextBytes(byte[])
和new BigInteger(byte[])
:
Random rand = new Random();
BigInteger r = new BigInteger(80, rand);
// or
byte bs[10];
rand.nextBytes(bs);
BigInteger r80bits = new BigInteger(bs);
[编辑] 听起来你对独特性比对随机性更感兴趣,特别是几乎没有机会使用相同的数字,在这种情况下,时间戳可能更有用。这是实现这一目标的一种方式,或多或少:
public static byte[] get80UniqueBits() {
// Put eight very likely unique bytes.
ByteBuffer buf = ByteBuffer.allocate(10);
buf.putLong(System.nanoTime());
// And two random bytes for good measure.
byte bytes[] = {0, 0};
new Random().nextBytes(bytes);
buf.put(bytes, 0, 2);
return buf.array();
}
请注意,最后两个字节不是绝对必要的。
答案 1 :(得分:1)
从你的意思上讲,时间戳并不是真正随机的。在它总是增加的意义上,它甚至不是伪随机的。
如果你想要一个80位的生成器,我之前已经实现了类似的东西,尽管生成器函数的输出较小。
您基本上使用nextLong
来获取64位随机值。然后将位从那里复制到其他16位位置。
你看到一个64位周期的方式是你复制的位位置(“位集”)每次迭代都不同,并且有一个素数的迭代(11,31,97,... )。
因此,例如,在迭代0,您可以将位1,7,9,11,3,... 12复制到其他16位位置。在下一次迭代中,您将复制一组不同的位。
这样,当真实发生器循环时,你很可能会处于不同的位集(由于它的主要大小)并且它们不会重复。
当然,更好的解决方案是找到一个真正的80位发生器 - 我只是提供这个解决方案来让事情快速发展。除非你是一个密码学家或一个统计学家,否则它会很好(但是再一次,64位生成器会被调用两次,值可能会移动和组合)。
答案 2 :(得分:0)
Random generator = new Random();
new BigInteger(80, generator);
如果您不想复制数字,除非明确维护Set
之前看到的数字并检查Set
,否则不会,也绝不会有任何方法可以避免它。