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

Java创建无重复的随机数

邢焕
2023-03-14
问题内容

在这种情况下,MAX仅为5,因此我可以一张一张地检查重复项,但是如何以更简单的方式进行检查呢?例如,如果MAX的值为20,该怎么办?谢谢。

int MAX = 5;

for (i = 1 , i <= MAX; i++)
{
        drawNum[1] = (int)(Math.random()*MAX)+1;

        while (drawNum[2] == drawNum[1])
        {
             drawNum[2] = (int)(Math.random()*MAX)+1;
        }
        while ((drawNum[3] == drawNum[1]) || (drawNum[3] == drawNum[2]) )
        {
             drawNum[3] = (int)(Math.random()*MAX)+1;
        }
        while ((drawNum[4] == drawNum[1]) || (drawNum[4] == drawNum[2]) || (drawNum[4] == drawNum[3]) )
        {
             drawNum[4] = (int)(Math.random()*MAX)+1;
        }
        while ((drawNum[5] == drawNum[1]) ||
               (drawNum[5] == drawNum[2]) ||
               (drawNum[5] == drawNum[3]) ||
               (drawNum[5] == drawNum[4]) )
        {
             drawNum[5] = (int)(Math.random()*MAX)+1;
        }

}

问题答案:

最简单的方法是创建一个可能数字的列表(1..20或任何数字),然后用对其进行混洗Collections.shuffle。然后,只需考虑你想要的许多元素。如果你的范围最终等于你需要的元素数量(例如,用于洗牌的卡片),则这非常好。

如果你想要(说)1..10,000范围内的10个随机元素,那么效果就不太好-你最终会不必要地进行大量工作。到那时,最好保留到目前为止已生成的一组值,并保持循环生成数字直到下一个不存在为止:

if (max < numbersNeeded)
{
    throw new IllegalArgumentException("Can't ask for more numbers than are available");
}
Random rng = new Random(); // Ideally just create one instance globally
// Note: use LinkedHashSet to maintain insertion order
Set<Integer> generated = new LinkedHashSet<Integer>();
while (generated.size() < numbersNeeded)
{
    Integer next = rng.nextInt(max) + 1;
    // As we're adding to a set, this will automatically do a containment check
    generated.add(next);
}

但是,请谨慎选择设置-我非常有意地使用LinkedHashSet它,因为它会保持插入顺序,我们在这里关心它。

另一种选择是通过每次减小范围并补偿现有值来始终取得进展。因此,举例来说,假设你要使用0..9范围内的3个值。在第一次迭代中,你将生成0..9范围内的任何数字-假设你生成了4。

在第二次迭代中,你将生成一个范围为0..8的数字。如果生成的数字小于4,则应保持原样…否则将其添加一个。这样得到的结果范围是0..9,而不是4。假设我们以这种方式得到7。

在第三次迭代中,你将生成一个范围为0..7的数字。如果生成的数字小于4,则将其保持原样。如果是4或5,则要加1。如果是6或7,则要加两个。这样,结果范围是0..9,没有4或6。



 类似资料:
  • 在本例中,最大值仅为5,因此我可以逐个检查副本,但如何以更简单的方式执行此操作?例如,如果最大值为20,该怎么办?谢谢

  • 问题内容: 我尝试使用,但一些数字相同。有没有一种方法/模块来创建唯一的随机数列表? 问题答案: 这将返回从0到99范围内选择的10个数字的列表,没有重复。 参考你的特定代码示例,你可能希望一次从文件中读取所有行,然后从内存中的已保存列表中选择随机行。例如: 这样,你只需要在循环之前实际从文件中读取一次即可。与返回文件开头并为每次循环迭代再次调用相比,执行此操作效率更高。

  • 我试图创建一个没有重复的随机数组。 任务是从用户那里获取一个整数数组和最大值,用0到最大值之间的随机数填充数组,并显示没有重复的随机数组,不使用任何其他类,除了随机和扫描仪。 这是一个示例输出: 请输入数组的大小:10 请输入最大值:50 [39,2,17,49,12,19,40,31,42,15] 我需要帮助删除重复的内容。我不确定我所做的是否正确,我是一个初学者,但这是我目前所做的。非常感谢帮

  • 问题内容: 有人可以帮助我制定一种无需重复在Android中生成随机数的方法吗?最大数量是:这是我的JSON数组。并且返回值应为整数。 我已经拥有的是: 我将方法强制转换了3次,因为我需要3个随机生成的数字。它有效,但是我不知道如何避免重复。因此,这3个数字彼此之间不会相同。 谢谢 问题答案: 您是否尝试过仅使用Math.random()? 只要做一些铸造魔术,您就可以轻松开始了: 编辑: 如果要

  • 如何使随机数发生器不重复数字?我试过这个,但它总是重复给我数字