随机方法导致重复模式?

时间:2016-05-30 14:05:51

标签: java random

我有一个JButtons数组,其中String文件名设置为文本(有点难以解释,但文件名指定图像,所以当我想为特定按钮设置图标时,我有一个方法可以拉按钮中的文件名文本并将其用于setIcon)。 String文件名存储在一个String数组中,我试图改变Strings,但问题是当我运行我的程序时,文件名没有被正确地洗牌。它们有随机位置,但我有24对匹配的文件名,每次运行时匹配的文件名总是3个按钮,这显然不是随机的。有谁知道为什么会这样?我怀疑这是我的setFace方法的问题,因为我正在使用混洗数组..帮助将不胜感激!

public void shuffle()
{
  for(int i = 0; i < 24; i++) 
   {
        int rand = (int)(Math.random() * 24);
        temp[i] = country[rand]; //temp is a temporary array
        country[rand] = country[i];//country is the filename array
        country[i] = temp[i];
   }

  card.setBack(cards); 
  card.setFace(country, cards); //cards is the 48 button array
 }

public void setFace(String[] file, JButton[] buttons) //filename method
{
  for(int i = 0; i < 24; i++)
  {
     buttons[i].setText(file[i]);
  }
  int ct = 0;
  for(int x = 24; x < 48; x++)
  {
     buttons[x].setText(file[ct]);
     ct++;
  }
}

public void setBack(JButton[] array) //sets back icon of card
{
  icon = new ImageIcon(this.getClass().getResource("back.png"));
  img = (icon.getImage().getScaledInstance(75, 95, java.awt.Image.SCALE_SMOOTH));
  thomas = new ImageIcon(img);

  for(int x = 0; x < array.length; x++)
  {
     array[x].setIcon(thomas);
  }
}

我所说的非随机安排是这样的:

Card A     Card R
Card D     Card H
Card F     Card Z
Card A     Card R
Card D     Card H
Card F     Card Z

1 个答案:

答案 0 :(得分:1)

如果你想以随机顺序显示一组元素并使用每个元素两次,你有几种方法可以做到:

1。)创建元素的数组/列表,并将每个元素添加两次然后随机播放并显示它(在您的情况下设置按钮文本)。

2。)创建元素列表并添加两个元素。然后迭代按钮并从列表中提取随机元素(删除它)。你可以这样做:

List<String> elements = ...;//create the list, like A,A,B,B,C,C etc.
Random r = new Random();
for( JButton b : buttons ) {
  //get a random element
  int index = r.nextInt( elements.size() ); //index is between 0 and list size exclusive
  String element = elements.remove( index ); //remove the element which returns it as well
  b.setText( element );
}

3。)不这样做。 2但迭代元素并选择2个随机按钮:

List<JButton> buttons = ...; //temporary list of buttons
Random r = new Random();
for( String element : elements ) {
  //remove a random button from the list and assign it the text
  buttons.remove( r.nextInt( buttons.size() ) ).setText(element);
  buttons.remove( r.nextInt( buttons.size() ) ).setText(element);
}