当前位置: 首页 > 面试题库 >

在Java中生成10位唯一的随机数

唐信瑞
2023-03-14
问题内容

我正在尝试使用下面的代码来生成10位唯一的随机数。根据我的要求,我必须创建大约5000个唯一编号。这无法正常工作。它还会生成-
ve数字。同样,有时生成的数字中缺少一两位数字,导致8或9个数字而不是10。

public static synchronized  List generateRandomPin(){

    int START =1000000000;
    //int END = Integer.parseInt("9999999999");
    //long END = Integer.parseInt("9999999999");
    long END = 9999999999L;

    Random random = new Random();

    for (int idx = 1; idx <= 3000; ++idx){
        createRandomInteger(START, END, random);
    }

    return null;
}


private static void createRandomInteger(int aStart, long aEnd, Random aRandom){
    if ( aStart > aEnd ) {
      throw new IllegalArgumentException("Start cannot exceed End.");
    }
    //get the range, casting to long to avoid overflow problems
    long range = (long)aEnd - (long)aStart + 1;
    logger.info("range>>>>>>>>>>>"+range);
    // compute a fraction of the range, 0 <= frac < range
    long fraction = (long)(range * aRandom.nextDouble());
    logger.info("fraction>>>>>>>>>>>>>>>>>>>>"+fraction);
    int randomNumber =  (int)(fraction + aStart);    
    logger.info("Generated : " + randomNumber);

  }

问题答案:

我认为您获得8/9位数字值和负数的原因是您要添加fraction一个long(带符号的64位值),该值可能大于的正数int范围(32位值)aStart

该值正在溢出,randomNumber处于负32位范围内或几乎缠绕到aStart(由于int是带符号的32位值,您fraction只需要稍微小于(2
^ 32- aStart)就可以看到8或9位数字)。

您需要使用long所有值。

   private static void createRandomInteger(int aStart, long aEnd, Random aRandom){
    if ( aStart > aEnd ) {
      throw new IllegalArgumentException("Start cannot exceed End.");
    }
    //get the range, casting to long to avoid overflow problems
    long range = aEnd - (long)aStart + 1;
    logger.info("range>>>>>>>>>>>"+range);
    // compute a fraction of the range, 0 <= frac < range
    long fraction = (long)(range * aRandom.nextDouble());
    logger.info("fraction>>>>>>>>>>>>>>>>>>>>"+fraction);
    long randomNumber =  fraction + (long)aStart;    
    logger.info("Generated : " + randomNumber);

  }


 类似资料:
  • 问题内容: 我正在开发一个需要生成一些唯一编号的应用程序,并且实际上没有预定义的限制,因此使用Java UUD生成器并且运行良好。现在,我们对生成12位唯一的随机数有了新的要求。 谁能指出我实现这一目标的一些好的方法/算法,因为我看不到UUID生成数字中的任何可能性。 提前致谢 问题答案: 通过调用生成每个数字。为了保持唯一性,您可以通过将随机数保存在集合中并检查集合中是否包含您每次生成的数字来跟

  • 问题内容: 我想在0-500范围内创建10个随机数。但是问题是我希望这些数字是唯一的。对于2个随机数,我可以创建以下内容: 但是,如果我这样做10次,我认为它会堆叠。我之所以这样说是因为我正在尝试创建一个巨大的算法,该算法试图进行连续评估,我希望连续获取10个随机且唯一的数字。我不知道该怎么办。有什么想法或建议吗? 问题答案: 每当您使用Fisher-Yates shuffle 来使用数字时,请从

  • 问题内容: 我正在尝试获取0到100之间的随机数。但是我希望它们是唯一的,而不是在序列中重复。例如,如果我有5个数字,它们应该是82,12,53,64,32而不是82,12,53,12,32(我使用了这个数字),但是它在序列中生成相同的数字。 问题答案: Add each number in the range sequentially in a list structure. Shuffle i

  • 问题内容: 我上面有一个方法,该方法应生成用户指定的随机元素数组。随机生成的整数应介于0到10之间(含0和10)。我能够生成随机整数,但是我遇到的问题是检查唯一性。我尝试检查唯一性是在上面的代码中,但是数组仍然包含整数的重复项。我做错了什么,有人可以给我提示吗? 问题答案: 您确实找到重复的值。但是,您将其替换为另一个可能重复的随机数。相反,请尝试以下操作: 但是,这种方法效率低下。我建议列出数字

  • 如何在1到9之间生成9个随机数,而不重复,一个接一个。它类似于:假设生成的第一个随机数是4,那么下一个随机数必须在[1,9]{4}中。我的第一种方法是将每个随机生成的数字添加到一个集合中,从而避免重复。但在更糟糕的情况下,比如我们已经生成了6个数字,我们必须再生成3个数字,这个过程会有点慢。当范围从[1,9]更改为[1,1000]时,这种方法听起来不正确。有人能提出一个替代方法吗。

  • 问题内容: 我正在尝试获取一个随机数列表,并将其放入队列中,而不会重复任何随机数。 通过上面的代码,我得到了一些随机数的重复 有人知道怎么做吗? 问题答案: 这个怎么样: 在某个范围内“添加唯一的随机数”等效于将范围内的所有数字相加,然后对结果进行混排。