这更像是一个谜题。我想知道是否有一种方法可以从n个项目列表中选择k个随机项目,因为n是未知的,我只想阅读一次项目列表。
谢谢
答案 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)