无重复的随机数生成器

Random number generator without duplication

我正在尝试编写一段代码,其中会生成一个随机数并将其保存在一个集合中,这样下次生成另一个随机数时我可以检查这个新数字是否已经在列表中或没有。

这个方法的重点是生成一个1到118之间的数字,不允许重复的数字。

Random rand = new Random();
    randomNum2 = rand.nextInt(118) + 1;
    if (!generated.contains(randomNum2))
    {
        String strTemp = "whiteElements\"+String.valueOf(randomNum2)+".JPG";
        btnPuzzlePiece2.setIcon(new ImageIcon(strTemp));
        generated.add(randomNum2);
        btnPuzzlePiece2.repaint();
    }
    else 
        setPicForBtnGame1();

但问题出在这段代码中,因为程序继续生成数字,有可能获得正确的随机数(在不重复的范围内)想象一下 运行 方法 110 次之后...的可能性生成有效随机数的方法减少到不到 1%...这使程序有可能永远不会拥有 1-118 的数字列表,并且还会浪费太多进程。

那么我怎样才能正确地写这个呢? p.s 我想制作 118 个对象并将它们保存在一个集合中,然后生成一个随机对象,然后从列表中删除该对象,这样下一个元素就不会被复制。

请帮帮我...

创建一个 List,并用您范围内的元素填充它。然后是shuffle()列表,顺序就是你的随机数。即第0个元素是你的第一个随机数,第1个元素是你的第二个随机数,依此类推

只生成永远不会重复的东西不是更好吗? 没有重复的随机数通常称为 UUID。

生成 UUID 的最简单方法是在您的随机数前面加上当前系统时间(以毫秒为单位)。 当然,它有可能是重复的,但它非常小。当然它可能会很长,所以你可能想对其进行 base64 编码,例如,以减小它的大小。

使用编码,您可以获得大约 8 个字符的或多或少有保证的 UUID。