2012-09-05 43 views
-1

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

+3

请发表相关的代码。 – kosa

+0

我认为[这个链接](http://stackoverflow.com/questions/11842533/generating-random-unique-data-takes-too-long-and-eats-100-cpu)应该有所帮助。我之前遇到过类似的问题。 但我觉得你应该发布一些代码。 –

+0

[什么是StackOverflowError?]可能重复(http://stackoverflow.com/questions/214741/what-is-a-stackoverflowerror) – Raedwald

回答

1

您应该在不使用递归的情况下执行此操作。算法的草图,可能效果更好:

  1. 创建一个空的列表
  2. 经过源阵列,并用50%的概率每一个元素添加到列表中
  3. 列表转换为数组
  4. 使用Arrays.shuffle()阵列上随机重新排序的元素

这应该做的工作。

1

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

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

0

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

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

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

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

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

在范围内的每个二进制数将映射到一个唯一的子集。你的例子意味着排序可能很重要。如果是,那么你将不得不单独处理它。这种方法会给你最多2^9 = 512种不同的组合。