繁体   English   中英

Java创建一个随机的ArrayList <Integer> 利用另一个ArrayList的数字

[英]Java Create a a Randomized ArrayList<Integer> that utilizes another ArrayList's numbers

我一直在解决这个问题。

我需要编写一个程序,以产生数字1到10的随机排列。

我解决这个问题的策略是:

要生成随机排列,您需要用数字1到10填充ArrayList,以便该数组的两个条目都不具有相同的内容。 我想避免调用Random.nextInt()。 而是通过制作第二个ArrayList并用数字1到10填充它来实现更智能的方法。然后随机选择其中一个, 删除 ,然后附加到置换ArrayList中。 重复十次。

我基本上是这样的:

import java.util.ArrayList;
import java.util.Random;
public class P4_Icel_Murad_Permutations
{

public static void main(String[] args){
   ArrayList <Integer> myArrayList = new ArrayList <Integer> ();
   P4_Icel_Murad_Permutations obj = new P4_Icel_Murad_Permutations();
   obj.perma(10,1,10);
}
static java.lang.Object[] perma(int n, int a, int b){
    ArrayList <Integer> myArrayList = new ArrayList <Integer> ();
    ArrayList <Integer> randomized = new ArrayList <Integer> ();  

     randomized.add(new Integer(1));
     randomized.add(new Integer(2));
     randomized.add(new Integer(3));
     randomized.add(new Integer(4));
     randomized.add(new Integer(5));
     randomized.add(new Integer(6));
     randomized.add(new Integer(7));
     randomized.add(new Integer(8));
     randomized.add(new Integer(9));
     randomized.add(new Integer(10));
     for(Integer N: randomized){
         Random r = new Random();
        randomized.remove(r);
        myArrayList.add(N);
    }

}

}

我的问题是我不太确定如何通过删除数字并将其添加到myArrayList来从其他列表中获取。 我似乎无法使用r,因为它是原始类型,而且我不知道如何为随机类创建对象。

提前致谢!

我认为您的开端很好。 但是,我认为一个更好的解决方案可能是:

首先,制作一个空的ArrayList来存储已经生成的值。 在for循环内,生成一个随机数,检查以确保indexOf返回-1(这意味着它在数组内不存在),如果存在,则追加到数组,如果不存在,则再次生成,直到返回-1。

如果要使用现有方法,则要生成一个介于0到9之间的整数(可以使用Random的nextInt()方法)来创建索引。

因此,它看起来像:

for(Integer N: randomized){
         Random r = new Random();
         //insert nextInt generator here, store it in a variable (i'm going to use j)
        myArrayList.add(randomized.remove(j));
    }

您可以做的就是使用Collections.shuffle()来对ArrayList进行洗牌。

ArrayList <Integer> randomized = new ArrayList <Integer> ();  

 randomized.add(new Integer(1));
 randomized.add(new Integer(2));
 randomized.add(new Integer(3));
 randomized.add(new Integer(4));
 randomized.add(new Integer(5));
 randomized.add(new Integer(6));
 randomized.add(new Integer(7));
 randomized.add(new Integer(8));
 randomized.add(new Integer(9));
 randomized.add(new Integer(10));

Collections.shuffle(randomized);
System.out.println(randomized);

这样可以避免使用单独的arrayList以及获得随机数并删除该特定索引的逻辑。 换句话说, 最佳


您的代码的问题在于,生成的随机数必须在0size - 1的范围内,您不会在意。

Random rand = new Random();

while(randomized.size() != 0)
{
  int randomNum = rand.nextInt(randomized.size());//produces a number within the range.
  myArrayList.add(randomized.get(randomNum));
  randomized.remove(randomNum);
}
System.out.println("List 1: " + randomized);
System.out.println("List 2: " + myArrayList);

改组是一个令人惊讶的难题,因为有很多方法可以将其弄错,但是如果您不注意,错误的方法看起来很像正确的方法。

此类问题的规范答案是Knuth / Fischer-Yates shuffle ,这是Collections.shuffle()所做的。 查阅Wikipedia上的文章:它非常全面。

在实施自己的改组时,请确保您阅读了Jeff Atwood的《奈特维特的危险》,其中解释了为什么仅对随机数进行“排序” 并不是正确的改组 ,并查看Eric Lippert的有关随机性博文,博文还提供了许多有用的背景知识。简单易懂的方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM