Android获得4个随机数

时间:2013-03-25 03:47:55

标签: java android while-loop

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

** 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;
                }       
            }
        }
    }

1 个答案:

答案 0 :(得分:2)

以随机排序顺序获取四个数字的更有效方法是执行以下算法:

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

2)对于i = 0;我&lt; array.length; ++ i,在i和array.length-1 包含之间生成一个随机数j,并交换i和j。

重要提示:这意味着可能的掉期将是00,01,02,03之一,接着是11,12,13之一,接着是22,23之一,接着是33之一。这给你全部4 * 3 * 2 * 1 = 4!排列数组的方法,以及算法正确所需的方法。

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

此改组算法的名称为:Fisher-Yates Shuffle

编辑:在整数范围内生成随机数的好方法是执行以下操作:

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

2)Random有一个方法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