我想尝试将一个独特的随机数从混洗列表中放入数组但仍然失败。
即时使用此answer几乎没有修改。
这是我的方法
ArrayList<Integer> list = new ArrayList<>();
for(int i=0;i<10;i++) {
list.add(i);}
Collections.shuffle(list);
for(int x=0;x<3;x++){
RNGee=RNG.nextInt(9);
RN[x]=list.get(RNGee);
if(RN[x]==QNum){
x=0;
}
}
当我打印出RN阵列时,其中一些有机会获得相同的值。
我的代码有问题吗? 请向我解释一下。 谢谢。
答案 0 :(得分:1)
最简单的方法就是使用list.get(0)
,list.get(1)
和list.get(2)
。列表是混洗的,因此列表头部的三个元素将是随机的和不同的。
for(int x=0;x<3;x++){
RN[x]=list.get(x);
if(RN[x]==QNum) { //but this is very unclear
x=0;
}
}
您的代码的部分内容尚未解释,如果您选择的随机数等于QNum
,则会将循环变量设置回0。它根本不清楚那里有什么,但我怀疑你需要事先从列表中删除QNum
,以便它永远不会出现:
for(int i=0;i<10;i++) {
if (i!=QNum) {
list.add(i);
}
}
答案 1 :(得分:0)
尽管你的解决方案正如chiastic-security所说的那样是不必要的,但你的错误是你的列表仍然包含10个元素而你正在随机挑选。
为了能够使用您的解决方案,您需要从列表中删除您选择的元素,并生成0-list.size-1
范围内的随机数。
ArrayList<Integer> list = new ArrayList<>();
for(int i=0;i<10;i++) {
list.add(i);}
Collections.shuffle(list);
for(int x=0;x<3;x++){
RNGee=RNG.nextInt(list.size()); // You collection gets smaller after each itteration so be sure to not run into a OutOfBound
RN[x]=list.get(RNGee);
list.remove(RNGee); // Remove the duplicate to be sure that the element doesn´t get picked twice
if(RN[x]==QNum){
x=0;
}
}
编辑:还要确保遵循java约定,它表示方法和变量应该以小写和类大写开头。这将使您的代码最终对我们和您自己更具可读性。