我是Android的新手,也是java的新手。在我的应用程序中,我需要的是随机数字。它不会再次重复。
举个例子说我有一个TextView和一个按钮,点击按钮它应该显示随机数字,那些随机数字不应重复。
为此我想将随机数据存储到数组中并检查随机数是否在数组中。如果它不存在于数组中,它将暂时存储该数字。就像第一次点击它应该给我看一些随机数,比如在1-20之间说它选择了5,现在这个值应该存储到数组中,如果再次点击下一个按钮5号,那么它应该跳过这个数字。
请帮我解决这个问题,
答案 0 :(得分:1)
按顺序创建一个包含数字的数组。然后使用Fisher-Yates shuffle算法生成唯一的非重复随机序列。
// Fisher-Yates shuffle.
Random random = new Random();
int[] data = new int[20];
for (int i=0; i<20; i++)
{
data[i] = i;
}
for (int i=0; i<20; i++)
{
int j = random.nextInt(20);
int t = data[i];
data[i] = data[j];
data[j] = t;
}
答案 1 :(得分:1)
您应首先创建Random
的实例。这将为您生成随机数。然后,您应该将所有已生成的数字保存在ArrayList<Integer>
中,以便您可以跟踪到目前为止生成的数字。
Random mRandom=new Random();
//Generate first number, int [0,20)
int no=mRandom.nextInt(20);
//keep that number
ArrayList<Integer> mGeneratedSoFar=new ArrayList<Integer>();
mGeneratedSoFar.add(no);
然后在你的按钮点击处理程序中,生成一个直到现在才生成的数字:
int no=mRandom.nextInt(20);
while(mGeneratedSoFar.contains(no)){
no=mRandmom.nextInt(20);
}
mGeneratedSoFar.add(no);
编辑:并且正如@Guido Garcia所说,您可以将您的号码保留在其他类型的Collection
或Maps
中以获得更好的效果。但只要您产生的数字很少,我认为这不会成为一个问题。
答案 2 :(得分:1)
讨论用于存储生成的随机数据的数据结构,请考虑使用java.util.Set来存储唯一的数字集。要检查Set use Set#contains(Object o)方法中是否已存在数字。
int max = 20;
System.out.println("Generating random integers in range 0.." + max);
Set<Integer> set = new HashSet<Integer>(max);
Random randomGenerator = new Random();
while (set.size() <= max) {
int randomInt = randomGenerator.nextInt(max+1);
System.out.println("Generated : " + randomInt);
if (!set.add(randomInt))
System.out.println("Set already has: " + randomInt);
}
System.out.println("Set has: " + set);
答案 3 :(得分:0)
我认为这个问题与Java有关,而与Android无关。
如果您只需要创建一小组唯一的随机数,您可以将生成的数字存储在Map中,这样您就可以在O(1)中确定之前是否生成过数字。如果之前没有生成,请使用它并将其放入地图中。否则创建一个新的并重复。
答案 4 :(得分:0)
java.util.Random generator;
java.util.Set<Integer> nums;
nums.add(generator.nextInt(20));