【发布时间】:2011-06-08 11:05:02
【问题描述】:
我正在编写一些 JavaScript 代码,如果该项目满足某些要求,它应该从画布中选择一个随机项目。有不同种类的物品(圆形、三角形、正方形等),每种物品的数量通常不一样。这些项目按层次排列(因此一个正方形可以包含几个圆圈,一个圆圈可以包含其他圆圈等等 - 它们都可以嵌套)。
现在,我选择随机项目的(原始)方法是:
- 递归遍历画布并构建一个(可能很大!)项目列表
- 随机播放列表
- 从前面迭代打乱的列表,直到找到满足一些额外要求的项目。
问题在于它不能很好地扩展。我经常遇到内存问题,因为递归深度太高或项目的总列表变得太大。
我正在考虑重写此代码,以便在遍历画布时考虑选择元素 - 但如果我不知道总共有多少元素,我不知道如何“随机”选择一个元素.
有人知道如何解决这个问题吗?
【问题讨论】:
-
你想要“真正的”随机性,还是“足够随机”的元素?
-
不。如果你确实管理了,那么你应该知道最后集合的大小:)
-
@Alexandre:它只需要足够随机——我不需要完美的分布。
-
@Alexandre C. 为什么不需要创建列表?
-
大家描述的叫做水库采样:en.wikipedia.org/wiki/Reservoir_sampling(虽然维基百科的文章不太好)
标签: javascript algorithm random graph-theory