我正在尝试生成一个长度为 X 的随机字符串。我想确保不会生成完全相同的两个序列,即使此代码同时在多台机器上运行也是如此。
“list”是我使用的字符列表,“min”和“max”是索引的范围,“length”是字符串的所需长度。
目前,我使用 System.nanoTime() 作为 Random 对象的种子。虽然我意识到 2 台机器不可能在精确到纳秒的同一时间运行并产生相同的输出,但我想让它成为一个万无一失的解决方案。
如果不增加字符串的长度或增加字符串中可包含的字符数,我如何才能增加此代码的随机性,从而使 2 个字符串永远不会相同??
String seq = "";
for (int i = 0; i < length; i++)
{
Random rnd = new Random();
rnd.setSeed(System.nanoTime());
int randomNum = rnd.nextInt((max - min) + 1) + min;
seq = seq + list[randomNum];
}
return seq;
最佳答案
这在原则上是不可能的:如果您生成一个长度为 n 的字符串,其中 k 个不同的字符,则恰好有 k^n 个可能字符串。一旦您生成了尽可能多的字符串,重复就会发生,实际上更早。
当在一台机器上运行时,你可能会记住生成的字符串并且只输出新的字符串,但在没有同步的两台机器上即使这样也是不可能的。
此外,将系统纳米级考虑在内也无济于事,因为相同的字符串可能出现在生成序列的不同位置。
但是如果您要求生成的字符串的序列在两台机器上必须不同,您的解决方案可能没问题,但是......
相关机器的启动时间之间可能存在相关性,这反过来会增加
System.nanoTime()
发生冲突的可能性。正如
System.nanoTime()
的 Javadoc 所说,返回的 long 的准确性可能比精度更差,即实际上可能不会返回所有可能的 long 值。
顺便说一句,new Random()
将与您的代码产生相同的效果,因为在这种情况下 System.nanoTime()
在内部用于播种。
关于java - 确保没有随机序列无限重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57716225/