[英]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
以及获得随机数并删除该特定索引的逻辑。 换句话说, 最佳
您的代码的问题在于,生成的随机数必须在0
到size - 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.