我有一个集合:[1,2,3,4,5,6,7,8,9],我需要从中产生随机数的独特元素,例如5,3,7,9,下一次:4,8。我的函数运行良好,但有时会抛出StackOverflowError,因为递归调用函数会生成随机数并检查是否没有重复项。我想知道如何防止这种情况发生。StackOverflowError和随机数
-1
A
回答
1
您应该在不使用递归的情况下执行此操作。算法的草图,可能效果更好:
- 创建一个空的列表
- 经过源阵列,并用50%的概率每一个元素添加到列表中
- 列表转换为数组
- 使用Arrays.shuffle()阵列上随机重新排序的元素
这应该做的工作。
1
一个解决方案是使用迭代(一个for
或while
循环)而不是递归。
另一种解决方案是首先制作一个可变的集合副本,并且每当您从中选择一个元素时,删除该元素,以便不存在重新选择它的风险。 (但请确保您制作的是您的收藏集的实际副本,例如new ArrayList<Integer>(originalCollection)
,这样您就不会从原始元素中删除元素。)
0
完整列表中的每个元素都存在或不存在于特定元素集合中。这告诉我们使用二进制。
0b000000000
映射到[],即所有数字不存在。
0b111111111
映射到[1,2,3,4,5,6,7,8,9],即存在所有数字。
两者之间的任何数字都被视为二进制数据,将映射到整个集合的一个子集。
0b001010101
映射到[3,5,7,9]
在范围内的每个二进制数将映射到一个唯一的子集。你的例子意味着排序可能很重要。如果是,那么你将不得不单独处理它。这种方法会给你最多2^9 = 512种不同的组合。
相关问题
- 1. 总和随机数
- 2. gfortran和随机数
- 3. 随机和负数
- 4. 数组和随机数
- 5. 数组,函数和随机
- 6. 数组和随机值
- 7. c#概率和随机数
- 8. 随机数和微软CNG
- 9. Java循环和随机数
- 10. 随机int64和float64数字
- 11. 概率和随机数
- 12. 随机数的总和
- 13. Android随机数和edittext
- 14. 随机数和多键c#
- 15. 具有随机范围和函数的随机数组
- 16. 在随机生成50个随机数中使用随机数#
- 17. FROM random随机导入*和导入随机有什么区别? (随机()和randrange())
- 18. 为每一行随机(随机)数据
- 19. 随机ArrayList没有随机数
- 20. C#随机数是不是“随机”
- 21. 随机数发生器dev /随机
- 22. 随机()不生成随机数
- 23. 从随机长生成随机数
- 24. 随机类不会创建随机数?
- 25. Java随机数不是随机的吗?
- 26. 随机函数随机化字母
- 27. 随机数发生器自动随机
- 28. 随机种子来产生随机数
- 29. 再现随机数(Python的2 /随机)
- 30. 随机遍历数组(不随机)
请发表相关的代码。 – kosa
我认为[这个链接](http://stackoverflow.com/questions/11842533/generating-random-unique-data-takes-too-long-and-eats-100-cpu)应该有所帮助。我之前遇到过类似的问题。 但我觉得你应该发布一些代码。 –
[什么是StackOverflowError?]可能重复(http://stackoverflow.com/questions/214741/what-is-a-stackoverflowerror) – Raedwald