1、随机数生成器
假设一个随机数生成器randK可以随机产生1-K之间的随机数,问如何能够构造一个randN的随机数生成器,一般来说
N<K
。
设
N<Km
,即m个randK生成器可以生成大于N个组合,则对于
n=Km/N
个组合,每个组合可以表示一个randN的生成随机数
2、随机洗牌问题
for i in range(n): swap(a[i], a[random(i,n)])
2.1 随机打乱一个数组(随机排列问题)
这里随机的在剩下的n-i个元素中选择一个元素放在i处,在每一次的选择过程中,每一个元素被选择的概率都为
1n−i
,这里的概率均等是对每一轮的选择而言的。
2.2 随机抽样问题
从一个包含n个元素的数组中随机地选择m个元素
因为要满足随机性,所以应该以
mn
的概率选择每一个元素。
从而 若
k=1
,此时随机生成
n
以内的随机数,但是要满足概率
同样 若
k=i
,以
m−in−i
概率选择。(
n−in∗m−in−i=m−in
)
2.3 高效的产生m个n范围内的不重复随机数
首先产生n个不重复数字的数组,然后随机选择其中数字的下标,输出选择得到的元素,然后将选择的结果移到数组的某位。
这种方法对空间要求挺高的。
3、蓄水池抽样问题
随机抽样问题的进阶版,主要处理情况为数据量巨大,此时N未知。
处理方法:
1-保留前m个元素
2-对于第m+i个元素,以
mm+i
的概率决定是否选择这个元素,然后在以
1m
的概率选择替换前m个位置中的第几个位置
4、带权采样问题
1-可以按照权值复制元素,然后按照普通方法处理