生成一个数字排除一些android按钮点击

时间:2017-09-13 20:38:31

标签: android

我想在一个范围内生成数字。从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必须为正

1 个答案:

答案 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]你可以简单地迭代它。