java - 确保没有随机序列无限重复

标签 java random

我正在尝试生成一个长度为 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/

相关文章:

java - 是否有处理重复项的排序 java 集合?

java - 动态表数据检索 - selenium webdriver

javascript - 随机CSS位置jquery

c++ - 返回相同值的随机数生成器(C++)

python - 随机数据生成器在 python 中对正则表达式进行数学运算

java - 无法统计应用程序。将 SpringBoot 从 2.0.6.RELEASE 更新到 2.1.0.RELEASE 后

java - hibernate 中实体的 setter 中的空指针异常

java - 查找给定 java.util.Date 对象距当前日期的天数

java - neo4j 中的随机后序遍历

random - 如何使用标准库在 Go 中生成*唯一*随机数流