Java 在android中,如何在不重复arraylist的情况下生成0-9范围内的三个随机数

Java 在android中,如何在不重复arraylist的情况下生成0-9范围内的三个随机数,java,android,arraylist,Java,Android,Arraylist,我这样存储我的号码: ArrayList<Integer> nr=new ArrayList<Integer>(); nr.add(0); nr.add(1); nr.add(2); nr.add(3); nr.add(4); nr.add(5); nr.add(6); nr.add(7); nr.add(8); nr.add(9); Random r1 = new Random(

我这样存储我的号码:

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

    nr.add(0);
    nr.add(1);
    nr.add(2);
    nr.add(3);
    nr.add(4);
    nr.add(5);
    nr.add(6);
    nr.add(7);
    nr.add(8);
    nr.add(9);

    Random r1 = new Random();
    Random r2 = new Random();
    Random r3 = new Random();

   int rnd1 = r1.nextInt(nr.size());
    nr.remove(rnd1);
   int rnd2 = r2.nextInt(nr.size());
    nr.remove(rnd2);
   int rnd3 = r2.nextInt(nr.size());
    nr.remove(rnd3);
ArrayList nr=new ArrayList();
新增(0)条;
第(1)条;
新增(2)号;
第3条增补(3);
第4号增补件;
第5条;
第6条;
第7号增补件;
第8条;
第9条;
Random r1=新的Random();
随机r2=新随机();
Random r3=新的Random();
int rnd1=r1.nextInt(nr.size());
移除编号(rnd1);
int rnd2=r2.nextInt(nr.size());
移除编号(rnd2);
int rnd3=r2.nextInt(nr.size());
移除编号(rnd3);

我试图删除生成的数字,但在尝试了几次之后,它会不断重复。这里的想法是,您正在生成一个范围为0..9的随机数。然后删除一个元素,并生成范围为0..8的另一个随机数。最后生成范围为0..7的第三个数字

正确的方法是使用生成的数字作为元素的索引。你用这个索引取一个元素:这是你的“随机”数。然后删除这个元素,这样就不能再使用它了(在我的例子中,我使用一个操作获得并删除元素:“删除”)

ArrayList nr=new ArrayList();
新增(0)条;
第(1)条;
新增(2)号;
第3条增补(3);
第4号增补件;
第5条;
第6条;
第7号增补件;
第8条;
第9条;
随机r=新随机();
int rndPos1=r.nextInt(nr.size());
int rnd1=移除次数(rndPos1);
int rndPos2=r.nextInt(nr.size());
int rnd2=移除次数(rndPos2);
int rndPos3=r.nextInt(nr.size());
int rnd3=nr.remove(rndPos3);
系统输出打印项次(rnd1+”,“+rnd2+”,“+rnd3);
您可以在ArrayList中选择前3项,如下所示:

import java.util.Arrays;
import java.util.ArrayList;
import java.util.Collections;

class Main {
  public static void main(String[] args) {
    ArrayList<Integer> nr =new ArrayList<Integer>();
    nr.add(0);
    nr.add(1);
    nr.add(2);
    nr.add(3);
    nr.add(4);
    nr.add(5);
    nr.add(6);
    nr.add(7);
    nr.add(8);
    nr.add(9);
    System.out.println("The ArrayList looks like: " + Arrays.toString(nr.toArray()));
    System.out.println("Three unique random numbers from it are:");
    //shuffle the list
    Collections.shuffle(nr);
    for(int i=0; i<3; i++) {
      System.out.println(nr.get(i));
      nr.remove(i);
    }
    System.out.println("The ArrayList now looks like: " + Arrays.toString(nr.toArray()));
    Collections.sort(nr);
    System.out.println("Sorted: " + Arrays.toString(nr.toArray()));
  }
}

试试看

您的代码有多处错误:
一,。您不需要每次都创建新的随机变量。
二,。因为您事先获得了所有选项,所以可能会遇到数组越界异常

在循环中获取随机数并检查,直到有3个唯一的数字。
您的代码如下所示:

ArrayList<Integer> nr=new ArrayList<Integer>();
nr.add(0);
nr.add(1);
nr.add(2);
nr.add(3);
nr.add(4);
nr.add(5);
nr.add(6);
nr.add(7);
nr.add(8);
nr.add(9);

Random r1 = new Random();
for(nr.size != 7) {
  nr.remove(r1.nextInt(nr.size()));
}

Random
通过种子生成随机数。如果两个
Random
对象具有相同的种子,则它们生成的随机数将相同。默认情况下,此种子是当前系统时间

在这里,您创建了三个
Random
对象:

Random r1 = new Random();
Random r2 = new Random();
Random r3 = new Random();
由于代码运行速度非常快,它们是在相同的毫秒内创建的,因此它们的种子是相同的。结果,它们生成相同的随机数

修复代码的第一步是只创建一个
Random

Random r = new Random();
下一步是修复从数组列表中选择随机数的方式。您应该在
rnd1
rnd2
rnd3

int rnd1 = r.nextInt(nr.size());
int result1 = nr.get(rnd1);
nr.remove(rnd1);
int rnd2 = r.nextInt(nr.size());
int result2 = nr.get(rnd2);
nr.remove(rnd2);
int rnd3 = r.nextInt(nr.size());
int result3 = nr.get(rnd3);
nr.remove(rnd3);
result1-3
是您的非重复随机数

我已帮助您清理了代码:

int index = r.nextInt(nr.size());
int result1 = nr.get(rnd1);
nr.remove(index);
index = r.nextInt(nr.size());
int result2 = nr.get(rnd2);
nr.remove(index);
index = r.nextInt(nr.size());
int result3 = nr.get(rnd3);
nr.remove(index);

洗牌列表并删除前/后3个数字?
Random r = new Random();
int rnd1 = r.nextInt(nr.size());
int result1 = nr.get(rnd1);
nr.remove(rnd1);
int rnd2 = r.nextInt(nr.size());
int result2 = nr.get(rnd2);
nr.remove(rnd2);
int rnd3 = r.nextInt(nr.size());
int result3 = nr.get(rnd3);
nr.remove(rnd3);
int index = r.nextInt(nr.size());
int result1 = nr.get(rnd1);
nr.remove(index);
index = r.nextInt(nr.size());
int result2 = nr.get(rnd2);
nr.remove(index);
index = r.nextInt(nr.size());
int result3 = nr.get(rnd3);
nr.remove(index);