StackOverflowError和随机数

时间:2012-09-05 02:36:15

标签: java random error-handling

我有一个集合:[1,2,3,4,5,6,7,8,9]我需要从中生成随机数量的唯一元素,例如: 5,3,7,9,下次:4,8。我的函数运行良好,但有时抛出StackOverflowError,因为对生成随机数的函数进行递归调用,并检查是否已经没有重复项。我想知道如何防止这种情况发生。

3 个答案:

答案 0 :(得分:1)

一种解决方案是使用迭代(forwhile循环)而不是递归。

另一种解决方案是首先制作集合的可变副本,每当您从中选择一个元素时,删除该元素,这样就不会有重新选择它的风险。 (但请确保您制作了收藏品的实际副本,例如new ArrayList<Integer>(originalCollection),这样您就不会从原始文件中删除元素。)

答案 1 :(得分:1)

你应该在不使用递归的情况下这样做。一个可能更好的算法草图:

  1. 创建一个空列表
  2. 浏览源数组并将每个元素以50%的概率添加到列表中
  3. 将列表转换为数组
  4. 在数组上使用Arrays.shuffle()随机重新排序元素
  5. 那应该做的。

答案 2 :(得分:0)

完整列表中的每个元素在特定元素集合中存在或不存在。这告诉我们使用二进制文件。

0b000000000映射到[],即所有数字都不存在。

0b111111111映射到[1,2,3,4,5,6,7,8,9]即所有数字。

两者之间的任何数字(被视为二进制)将映射到整个集合的子集。

0b001010101映射到[3,5,7,9]

范围中的每个二进制数都将映射到唯一的子集。您的示例意味着订购可能很重要。如果是,那么你将不得不单独处理它。这种方法最多可以提供2 ^ 9 = 512种不同的组合。