0

我需要随机获取数字 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;
                }       
            }
        }
    }
4

1 回答 1

2

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

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

2) 对于 i = 0;我<数组.长度;++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,因此一些洗牌比其他更可能出现。)

这种洗牌算法有一个名字:Fisher-Yates Shuffle

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

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

2) Random 有一个方法,nextInt(n)它返回一个介于 0 和 n - 1 之间的随机整数,因此要获得 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

于 2013-03-25T03:52:16.923 回答