java - 如何生成1到8的随机数而不重复?

标签 java random awt shuffle

我使用 Java AWT 创建了以下随机拼图。在程序开始时,如您所见,所有数字均按顺序排列。我想生成不重复的随机数。这个怎么做?我应该使用 Random类(class)?

import java.awt.*;
import java.awt.event.*;
class Puzzle extends Frame implements ActionListener
{
    Button b1,b2,b3,b4,b5,b6,b7,b8,b9;
    Puzzle()
    {
        setTitle("Shuffle");
        setSize(500,500);
        setLayout(new GridLayout(3,3));
        setVisible(true);
        Font f=new Font("Arial",Font.BOLD,100);

        b1=new Button("1");
                            b1.setFont(f);
                            b1.addActionListener(this);
        b2=new Button("2");
                            b2.setFont(f);
                            b2.addActionListener(this);
        b3=new Button("3");
                            b3.setFont(f);
                            b3.addActionListener(this);
        b4=new Button("4");
                            b4.setFont(f);
                            b4.addActionListener(this);
        b5=new Button("5");
                            b5.setFont(f);
                            b5.addActionListener(this);
        b6=new Button("6");
                            b6.setFont(f);
                            b6.addActionListener(this);
        b7=new Button("7");
                            b7.setFont(f);
                            b7.addActionListener(this);
        b8=new Button("8");
                            b8.setFont(f);
                            b8.addActionListener(this);
        b9=new Button(" ");
                            b9.setFont(f);
                            b9.addActionListener(this);

        add(b1); add(b2); add(b3);
        add(b4); add(b5); add(b6);
        add(b7); add(b8); add(b9);




    } 
    public void actionPerformed(ActionEvent ae)
    {
        if(ae.getSource() == b1)
        {
            if(b2.getLabel() == " ")
            {
                b2.setLabel(b1.getLabel());
                b1.setLabel(" ");
            }
        else if(b4.getLabel() == " ")
            {

              b4.setLabel(b1.getLabel());
                b1.setLabel(" ");
            }

        }
        if(ae.getSource() == b2)
        {
            if(b1.getLabel() == " ")
            {
                b1.setLabel(b2.getLabel());
                b2.setLabel(" ");
            }
        else if(b3.getLabel() == " ")
            {

              b3.setLabel(b2.getLabel());
                b2.setLabel(" ");
            }
            else if(b5.getLabel() == " ")
            {

              b5.setLabel(b2.getLabel());
                b2.setLabel(" ");
            }

        }
        if(ae.getSource() == b3)
        {
            if(b2.getLabel() == " ")
            {
                b2.setLabel(b3.getLabel());
                b3.setLabel(" ");
            }
        else if(b6.getLabel() == " ")
            {

              b6.setLabel(b3.getLabel());
                b3.setLabel(" ");
            }

        }
        if(ae.getSource() == b4)
        {
            if(b1.getLabel() == " ")
            {
                b1.setLabel(b4.getLabel());
                b4.setLabel(" ");
            }
        else if(b5.getLabel() == " ")
            {

              b5.setLabel(b4.getLabel());
                b4.setLabel(" ");
            }
            else if(b7.getLabel() == " ")
            {

              b7.setLabel(b4.getLabel());
                b4.setLabel(" ");
            }

        }
        if(ae.getSource() == b5)
        {
            if(b2.getLabel() == " ")
            {
                b2.setLabel(b5.getLabel());
                b5.setLabel(" ");
            }
        else if(b4.getLabel() == " ")
            {

              b4.setLabel(b5.getLabel());
                b5.setLabel(" ");
            }
            else if(b6.getLabel() == " ")
            {

              b6.setLabel(b5.getLabel());
                b5.setLabel(" ");
            }
            else if(b8.getLabel() == " ")
            {

              b8.setLabel(b5.getLabel());
                b5.setLabel(" ");
            }

        }
        if(ae.getSource() == b6)
        {
            if(b3.getLabel() == " ")
            {
                b3.setLabel(b6.getLabel());
                b6.setLabel(" ");
            }
        else if(b5.getLabel() == " ")
            {

              b5.setLabel(b6.getLabel());
                b6.setLabel(" ");
            }
        else if(b9.getLabel() == " ")
            {

              b9.setLabel(b6.getLabel());
                b6.setLabel(" ");
            }

        }
        if(ae.getSource() == b7)
        {
            if(b4.getLabel() == " ")
            {
                b4.setLabel(b7.getLabel());
                b7.setLabel(" ");
            }
        else if(b8.getLabel() == " ")
            {

              b8.setLabel(b7.getLabel());
                b7.setLabel(" ");
            }

        }
        if(ae.getSource() == b8)
        {
            if(b5.getLabel() == " ")
            {
                b5.setLabel(b8.getLabel());
                b8.setLabel(" ");
            }
        else if(b7.getLabel() == " ")
            {

              b7.setLabel(b8.getLabel());
                b8.setLabel(" ");
            }
            else if(b9.getLabel() == " ")
            {

              b9.setLabel(b8.getLabel());
                b8.setLabel(" ");
            }

        }
        if(ae.getSource() == b9)
        {
            if(b6.getLabel() == " ")
            {
                b6.setLabel(b9.getLabel());
                b9.setLabel(" ");
            }
        else if(b8.getLabel() == " ")
            {

              b8.setLabel(b9.getLabel());
                b9.setLabel(" ");
            }

        }

    }
    public static void main(String args[])
    {

      new Puzzle();
    }
}

最佳答案

你可以这样做:

// global scope
List<Integer> container = new ArrayList<>();

//populate it
for(int i =1; i<=8; i++){
   container.add(i);
}
..........
..........
..........
public static int getRandom(){
    //to refill it if ya need to call it more than 8 times
    //if(container.size()==0){for(int i=1; i<=8; i++){container.add(i);} 
    Random generator = new Random();

    Integer randomNumber = container.get(generator.nextInt(container.size()));

    container.remove(randomNumber);

    return randomNumber;
}

此外,如果您想用 1 到 8 之间的唯一数字随机命名/标记每个按钮,只需执行以下操作:

b1=new Button(String.valueOf(getRandom()));

等等。

关于java - 如何生成1到8的随机数而不重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45042598/

相关文章:

c++ - 当 std::uint_fast32_t 在 GCC 中为 4 字节时,std::mt19937 失败

python - 如何让 Python 在两个选项之间做出选择?

php - SHA1等哈希函数的随机性

java - 自定义布局 Swing 应用程序

java - 编译错误 - 包不存在 - Java

java - 确定后续同级的正确 xpath

java - setOnItemClickListener 自定义 Listview

java - 为什么使用 JSF 在 EL 中为#{1/0} 生成 "Infinity"?

java - Swing 2D 游戏性能低下

java - Swing 图形不会显示 - Java