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