列表中的随机项

时间:2010-11-27 01:21:50

标签: list random puzzle

这更像是一个谜题。我想知道是否有一种方法可以从n个项目列表中选择k个随机项目,因为n是未知的,我只想阅读一次项目列表。

谢谢

4 个答案:

答案 0 :(得分:2)

我想我的问题的答案是:

pick first k elements and store them into an array of length k
for each element x > k
   insert x with probability k/x
   choose position at random between 1 and k

答案 1 :(得分:1)

容易(如果k <= n)。这就像得到一个k数列表&lt; ñ。这将是要获得的数字位置列表。创建范围列表(0..n),从中获取k个随机数。在最后一刻之前,您不必阅读实际的物品清单。显然这只是有用的,因为最终的项目列表读取速度很慢(从磁盘或类似的东西读取)。

要获取要选择的项目的位置,请执行以下操作:

import random
itemstopick = random.Random().sample(range(0,n), k)

如果n,项目数量未知,则必须从选择前k个项目开始(如果k = n,则为解决方案)。然后唯一的选择是继续读取项目并选择保持新项目只是读取(并删除另一项目)或保持当前项目不变。为了坚持统一的概率,你必须减少在你继续选择最后读取项目的概率。保留最后一项的概率应始终为P(k / n0),其中n0为n的值。我不相信你能做得更好。

如果你知道一些n的minorant(你可以保证n的值大于它),只需混合上面的两种方法。从使用minorant而不是n创建的列表开始,然后继续使用minname。

答案 2 :(得分:0)

这取决于你是否有生成的随机值,如果你有,可能,如果不是,你将不得不生成它们,你将需要大约从2 * k到3 * k的操作情况下

答案 3 :(得分:0)

  1. 从列表中的当前位置跳过随机项目数
  2. 拿走当前项目。
  3. 如果您已到达列表的末尾,请跳至列表的开头并转到步骤1
  4. 重复这些步骤k次。