【发布时间】:2012-01-27 15:49:23
【问题描述】:
假设我有一个列表列表,如下所示:
- [[a, b, c, d, e],
- [f, g, h],
- [i, j, k, l]]
所以外部列表的大小为 3,内部列表的大小为 5、3 和 4。
我需要从任何这些内部列表中获取一个随机元素,假设每个元素都有同样随机的机会。所以我可以写一个算法:
- 在
0和totalListsSize (5 + 3 + 4) = 12之间生成一个随机数,例如randomIndex 7 - 遍历所有列表并减去它们的大小,如果它大于它们的大小,例如
randomIndex 7 - firstListSize 5 = newRandomIndex 2 - 返回下一个列表中的元素
randomIndex 2 in secondList = element g。
问题是顺序选择必须是完整且可耗尽的:在上面示例中的 12 次顺序选择之后,我必须选择每个元素一次。
有没有一种可扩展的方法?
- 不首先初始化所有列表并随机化加入的列表
- 如果持有已选择索引的布尔数组,则无需遍历该布尔数组来转换生成的
randomIndex。
【问题讨论】:
标签: java algorithm collections random