algorithm - 从集合中以相等概率选择数字

标签 algorithm random numbers set

从 Steven Skiena 的算法设计手册中得到这个问题。

要求从给定的n个数集合S中选出k(给定值)个数组成子集S',使得每个数的选择概率都相等(k/n)。 n 是未知的(我正在考虑将 S 作为链接列表)。 同样,我们只能通过集合 S。

最佳答案

n 未知时,您宁愿需要一个在线算法来进行所谓的水库采样

这里提供了很好的解释和证明草图http://propersubset.com/2010/04/choosing-random-elements.html

我的意思是这个用 Python 实现的算法(取自上面的链接)

import random
def random_subset( iterator, K ):
    result = []
    N = 0

    for item in iterator:
        N += 1
        if len( result ) < K:
            result.append( item )
        else:
            s = int(random.random() * N)
            if s < K:
                result[ s ] = item

    return result

关于algorithm - 从集合中以相等概率选择数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8516664/

相关文章:

javascript - 使用按钮添加到变量

performance - 伊辛二维优化

algorithm - 位操作 AdHoc 变体

matlab - 创建两个不同随机整数的优雅方式

java - 生成 -1 和 1 之间的随机 float 会产生 NaN

swift - 泛型函数的类型应该采用什么协议(protocol)来将任何数字类型作为 Swift 中的参数?

Ruby - 计算字符串中每个单词的重复次数

c# - 生成排列的此 LINQ 代码的说明

java - 随机数发生器

c++ - 如何将数字转换为 0.mynumber