随机生成java唯一数

随机生成java唯一数,java,random,int,Java,Random,Int,我将实现唯一随机数生成器。但当运行此命令时,它有时会生成与前一个命令相同的数字。在这种情况下,如何确保生成的数字不会重复 下面是我的代码 int refno = 0; SecureRandom r = new SecureRandom(); refno = r.nextInt(999999999); Random和SecureRandom返回一个随机数。随机数从来都不是唯一的(否则它们就不是随机的) 要创建唯一标识符,请使用类java.util.UUID随机数生成器在

我将实现唯一随机数生成器。但当运行此命令时,它有时会生成与前一个命令相同的数字。在这种情况下,如何确保生成的数字不会重复

下面是我的代码

    int refno = 0;

    SecureRandom r = new SecureRandom();
    refno = r.nextInt(999999999);

Random
SecureRandom
返回一个随机数。随机数从来都不是唯一的(否则它们就不是随机的)


要创建唯一标识符,请使用类
java.util.UUID

随机数生成器在有限范围内创建数字,因此它迟早会重复自身

当您生成的数字范围很小时(比如当您想要模拟一副牌时),您可以创建一个包含所有可能值的列表,随机洗牌,然后以现在随机的顺序返回元素

 class UniqueRandom {
      private LinkedList<Integer> results;

      public UniqueRandom(int range) {
           results = new LinkedList<Integer>(range);
           for (var i = 0; i < range; i++) {
                results.add(i);
           }

           Collection.shuffle(results, new SecureRandom());
      }

      public int nextInt() throws NoSuchElementException {
           return results.pop(); // will throw NoSuchElementException when all values are used up
      }
 }
类UniqueRandom{
私有链接列表结果;
公共UniqueRandom(整数范围){
结果=新的LinkedList(范围);
对于(变量i=0;i
如果由于范围太大而无法执行此操作,则可以将已生成的数字存储在一个集合中。在返回结果之前,请检查该结果是否已在该集中,如果已在该集中,请重新滚动

 class UniqueRandom {
      private Set<Integer> used = new HashSet<Integer>();
      private Random rand = new SecureRandom();

      public int nextInt(int max) {
          Integer ret = null;
          do {             
             ret = rand.nextInt(max);
          } while (used.add(ret) == false); 
          return ret;
      }
 }
类UniqueRandom{
使用的私有集=新HashSet();
private Random rand=new SecureRandom();
公共整数nextInt(整数最大值){
整数ret=null;
做{
ret=下一次随机数(最大值);
}while(used.add(ret)=false);
返回ret;
}
}
警告:生成的数字越多,后一种算法将变得越来越慢,当所有值都用完时,最后将进入一个无限循环,因此只有在您能够确保结果范围永远不会用尽时才使用它。或者,您可以检查已使用的
的大小
,当异常太大时抛出异常。

您可以使用


由于UUID是128位的数字,您必须将其转换为BigInteger。

使用同步序列,而不是随机序列。你不能用随机数创建唯一的数字…相关的可能重复:你可以将已经使用过的随机数存储在一个集合中,并重复生成,如果你发现生成的数字是这样的:当你想要“一个非常大的数字”时,您可以使用常量
整数。MAX_VALUE
而不是像
9999999
这样的任意值。我相信UUID是十六进制的(例如我刚刚生成了一个,它是02c9c6b0-2f9b-4ae5-a6e5-c2a2a59b4382),这是否会导致存储在BigInteger中的困难;为什么要转换呢?好吧,如果他必须有一个整数表示。这并不难。看看UUIDAPI。它有
long getMostSigBits()
long getLeastSigBits()
方法。
UUID.randomUUID();