代码之家  ›  专栏  ›  技术社区  ›  user8141219

如何在不重复的情况下生成1到8的随机数?[副本]

  •  1
  • user8141219  · 技术社区  · 8 年前

    我使用Java AWT创建了以下洗牌拼图。正如你所见,在程序开始时,所有数字都是按顺序排列的。我想生成不重复的随机数。怎么做?我应该使用 Random

    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();
        }
    }
    
    3 回复  |  直到 5 年前
        1
  •  1
  •   Yahya    8 年前

    你可以这样做:

    // 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;
    }
    

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

        2
  •  0
  •   Edwin Buck    8 年前

    由于您是从集合中随机选择一个数字,因此不要使用 Random 数字生成器要选择数字,请使用 要从剩余可用数字中选取的数字生成器。

     List<Integer> choices = getNewChoices();
     int choice = choices.remove(random.nextInt(choices.size());
    

    选择最终会变得越来越小,但未选择的元素仍然存在 List .

    selectOne

    public class Whatever {
    
         public void run() {
             ...
             List<Integer> choices = getNewChoices();
             ...
             int choice = selectOne(choices);
         }
    
         public List<Integer> getNewChoices() {
             return Arrays.toList(new Integer[] { 1, 2, 3, 4, 5, 6, 7, 8});
         }
    
         public int selectOne(List<Integer> choices) {
             if (choices.length() > 0) {
                 return choices.remove(random.nextInt(choices.size());
             }
             throw new RuntimeException("out of choices");
         }
     }
    
        3
  •  0
  •   El8dN8    8 年前

    一般回答:

    编辑:很抱歉,这里的内容与另一个人发布的内容基本相同。他先到了。

    ArrayList<Integer> draw = new ArrayList<Integer>();
    for(int i = 1; i<=8; i++){
        draw.add(i); //Add every number once
    }
    
    //Every time you call it, you pick a random item from the list.
    //Then you remove it from it to prevent being recalled. Therefore it won't be re-accesed.
    Random r = new Random();
    int placeholder = r.nextInt(draw.size());
    int num = draw.get(placeholder);
    draw.remove(placeholder);
    

    对你来说,这是你应该做的:

    ...
    ArrayList<Button> buttonlist = new ArrayList<Button>(); /// ADD THIS. Put this outside the method/function.
    ...
    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);
                            buttonlist.add(b1); /// ADD THIS
        b2=new Button("2");
                            b2.setFont(f);
                            b2.addActionListener(this);
                            buttonlist.add(b2); /// ADD THIS
        b3=new Button("3");
                            b3.setFont(f);
                            b3.addActionListener(this);
                            buttonlist.add(b3); /// ADD THIS
        b4=new Button("4");
                            b4.setFont(f);
                            b4.addActionListener(this);
                            buttonlist.add(b4); /// ADD THIS
        b5=new Button("5");
                            b5.setFont(f);
                            b5.addActionListener(this);
                            buttonlist.add(b5); /// ADD THIS
        b6=new Button("6");
                            b6.setFont(f);
                            b6.addActionListener(this);
                            buttonlist.add(b6); /// ADD THIS
        b7=new Button("7");
                            b7.setFont(f);
                            b7.addActionListener(this);
                            buttonlist.add(b7); /// ADD THIS
        b8=new Button("8");
                            b8.setFont(f);
                            b8.addActionListener(this);
                            buttonlist.add(b8); /// ADD THIS
        b9=new Button(" ");
                            b9.setFont(f);
                            b9.addActionListener(this);
                            buttonlist.add(b9); /// ADD THIS
        Random r = new Random(); /// ADD THIS
        while(buttonlist.size() != 0){ /// ADD THIS
            int placeholder = r.nextInt(buttonlist.size()); /// ADD THIS
            Button button = buttonlist.get(placeholder); /// ADD THIS
            add(button); /// ADD THIS AFTER REPLACING all the original add(b1)...
            buttonlist.remove(placeholder); /// ADD THIS
        } /// ADD THIS
    }