我想在一个范围内生成数字。从1到10,不要重复已经生成的那些。
主要活动:
int[] ex = {};
Random rnd = new Random();
我生成数字的点击按钮:
public void onClick(View v) {
String f = from.getText().toString();
int ff = Integer.parseInt(f);
String t = to.getText().toString();
int tt = Integer.parseInt(t);
int val = getRandomWithExclusion(ff, tt, ex);
String item = Integer.toString(val);
Toast.makeText(MainActivity.this, item, Toast.LENGTH_SHORT).show();
ex = add(ex, val);
Log.d("this is my array", "arr: " + Arrays.toString(ex));
}
add是一个将生成的数字添加到ex []:
的函数public static int[] add(int[] initialArray , int newValue) {
int[] newArray = new int[initialArray.length + 1];
System.arraycopy(initialArray, 0, newArray, 0, initialArray.length);
newArray[newArray.length - 1] = newValue;
return newArray;
}
以及无法正常工作的功能(重复数字,经过10次尝试(1到10范围)后,它会显示致命异常:
public int getRandomWithExclusion(int start, int end, int... exclude){
int rangeLength = end - start - exclude.length;
int randomInt = rnd.nextInt(rangeLength) + start;
for (int anExclude : exclude) {
if (anExclude > randomInt) {
return randomInt;
}
randomInt++;
}
return randomInt;
}
为什么重复这些数字?以及为什么在点击10次按钮(范围1到10)后显示异常:
java.lang.IllegalArgumentException:n必须为正
答案 0 :(得分:1)
这听起来比尝试生成尚未生成的随机数更好的方法是创建有效(唯一)值的列表,然后随机化列表。
List<String> numbers = Arrays.asList("1", "2", "3", "4", "5", "6", "7", "8", "9", "10");
Collections.shuffle(numbers);
现在列表将是例如[7, 6, 1, 5, 10, 3, 9, 4, 8, 2]
你可以简单地迭代它。