我遇到了这个问题。
我需要编写一个程序来产生数字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,因为它是一种原始类型,我不知道如何为随机类创建一个对象。
提前致谢!
答案 0 :(得分:0)
我认为你有一个良好的开端。但是,我认为更好的解决方案可能就是:
首先,创建一个空的ArrayList,它将存储已生成的值。在for循环中,生成一个随机数,检查以确保indexOf
返回-1(这意味着它不存在于数组内),如果存在,则附加到数组,如果不是,再次生成,直到它返回-1。
如果您使用现有方法,则需要生成0-9之间的整数(您可以使用随机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));
}
答案 1 :(得分:0)
您可以做的只是使用ArrayList
随机播放Collections.shuffle()
。
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);
答案 2 :(得分:0)
改组是一个非常难以解决的问题,因为有很多方法可以解决它,但如果你不注意,错误的方式看起来很像正确的方式。
这类事情的典型答案是Knuth/Fischer-Yates shuffle,这是Collections.shuffle()
所做的。查看维基百科的文章:它非常全面。
当你自己实施改组时,请务必阅读杰夫阿特伍德的The Danger of Naïveté,这解释了为什么只是通过随机数“排序”是不正确的洗牌,并查看Eric Lippert的{{3它还以易于理解的方式提供了许多有用的背景。