2013-03-25 81 views
0

我需要随机获取数字1-4并将其存储在arrayList中。我有一个好的开始,但我可能会有一个无限循环,因为模拟器不断崩溃。这些数字也不能被使用一次以上。Android获得4个随机数

** lightSelector is a global variable (int lightSelector = 1;) 
** generatedOrder is my ArrayList 

for (int i = 0; i < 4; i++) 
{ 
     lightSelector = 1 + (int)(Math.random() * 4);   
     generatedOrder.add(lightSelector); 
     boolean contains = true; 
     System.out.print(generatedOrder.get(i)); 
     if (!generatedOrder.isEmpty()) 
     { 
      // Loop until a number is generated that hasn't already been picked 
      while (contains) 
      { 
       if (generatedOrder.contains(lightSelector)) 
        lightSelector = 1 + (int)(Math.random() * 4); 
       else 
       { 
        generatedOrder.add(lightSelector); 
        contains = false; 
        break; 
       }  
      } 
     } 
    } 
+0

如果发生崩溃,您将得到一个logcat输出。这是什么意思? – 2013-03-25 03:49:40

+0

打开跟踪文件时出错:没有这样的文件或目录(2) – Andrew 2013-03-25 03:51:13

+0

它会更长。大约10-30行。红色或黄色。编辑它到您的问题 – 2013-03-25 03:52:15

回答

2

一种更有效的方式在一个随机排序,以获得四个数字是执行以下算法:

1)创建一个int []数组如{1,2,3,4} ;

2)对于i = 0;我< array.length; ++ i,在i和array.length-1之间产生一个随机数j,其中包括和交换i和j。

重要提示:这意味着可能的互换将遵循00,01,02,03后面紧跟着的一个22,23的11,12,13一个一个由33一个这给你所有4 * 3 * 2 * 1 = 4!排列数组的方法,这是算法正确所必需的。

(如果,例如,你有4^4 = 256的算法来完成可能的方式,24不进入256均匀,所以一些洗牌会更可能出现比其他人。)

该混洗算法有一个名字:Fisher-Yates Shuffle

编辑:一个好方法中的整数范围内产生的随机数是执行以下操作:

1)生成Random rng = new Random();恰好一次。不要再创建一个新的,因为如果你在同一时间创建两个Random实例,它们会给出完全相同的随机数字流。

2)随机有一个方法,nextInt(n)返回一个0和n-1之间的随机int,因此得到i和j之间的随机数,包括do nextInt(j+1-i)+i。要获得i和j之间但不包括j的随机数,请执行nextInt(j-i)+i

API参考号:http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Random.html

+0

要生成随机数j,除了更改最大值/最小值之外,是否应该使用与lightSelector相同的逻辑? – Andrew 2013-03-25 03:57:21

+0

@Andrew我按我喜欢的方式编辑成我的答案。 – Patashu 2013-03-25 04:02:07

+0

谢谢!我会给它一个镜头。 – Andrew 2013-03-25 04:05:40