1

我正在尝试n在我的 Android 代码中生成 0-31 之间的随机数。下面是我正在使用的代码:

int max_range = 31;
SecureRandom secureRandom = new SecureRandom();
int[] digestCodeIndicesArr = new int[indices_length];
int i = 0, random_temp = 0;

while (i != indices_length-1) {
    random_temp = secureRandom.nextInt(max_range);
    if (!Arrays.asList(digestCodeIndicesArr).contains(random_temp)) {
        digestCodeIndicesArr[i] = random_temp;
        i++;
    }
}

indices_length是我需要的随机数的数量。通常是 6,7 或 9。但是当我打印生成的数组时,我通常最终会看到重复。有人可以指出我犯的错误。我添加了以下代码行以过滤掉随机重复项:

if (!Arrays.asList(digestCodeIndicesArr).contains(random_temp))

提前致谢!

4

2 回答 2

1

Arrays.asList(digestCodeIndicesArr)不会产生List<Integer>with size() == digestCodeIndicesArr.length
它产生一个List<int[]>with size() == 1,其中第一个(也是唯一的)元素是数组。
因此,它永远不会包含random_temp,所以! contains()总是如此。

不断创建列表并执行顺序搜索以检查重复项对性能不利。使用 aSet代替,与数组并行维护,或者LinkedHashSet先使用 a,然后转换为数组。

无论如何,这解释了为什么您的代码不起作用。Tunaki 提供的重复链接和我在评论中提供的重复链接解释了如何实际做你想做的事情。

于 2016-01-27T19:28:53.310 回答
1

你需要改变:

int[] digestCodeIndicesArr = new int[indices_length];

到:

Integer[] digestCodeIndicesArr = new Integer[indices_length];

因为Arrays.asList(digestCodeIndicesArr)List<int[]>,而不是你想的可能(List<int>或者List<Integer>我猜)。

于 2016-01-27T19:46:57.690 回答