【发布时间】:2010-09-26 01:03:45
【问题描述】:
最近我需要对列表中的元素进行加权随机选择,包括替换和不替换。虽然有一些众所周知且很好的非加权选择算法,还有一些用于不带替换的加权选择(例如对 resevoir 算法的修改),但我找不到任何好的带替换加权选择算法。我还想避免使用 resevoir 方法,因为我选择了列表的很大一部分,它小到足以保存在内存中。
有人对这种情况下的最佳方法有什么建议吗?我有自己的解决方案,但我希望找到更高效、更简单或两者兼而有之的解决方案。
【问题讨论】:
-
看到这个问题stackoverflow.com/q/10164303/112100,还以为是C#而不是python,代码很少,大家应该看懂
-
对于其他必须查找它的人来说,“水库算法”位于维基百科的“reservoir sampling”下。引用的第一篇论文是 Jeffrey Scott Vitter 的“带有水库的随机抽样”,来自 ACM Transactions on Mathematical Software,Vol. 11,第 1 期,1985 年 3 月 1 日,第 37--57 页。
-
对于加权无替换,其中权重意味着被选择的概率与权重成正比,请参阅我的答案:stackoverflow.com/a/27049669/262304 请注意,某些输入没有解决方案,例如从 {'a': 3, 'b': 1, 'c: 1} 中选择 2 应该产生 'a' 的频率是 b 或 c 的 3 倍,但这是不可能的。
标签: python algorithm random random-sample