随机置乱与蓄水池抽样
Random Permutation
题目详情
A. 如何洗牌 52 张,使每个排列等可能?
B. 给定一个未知长度的文件,如何等概率随机选取其中一个字符?
A. Shuffle 52 cards so each permutation is equally likely?
B. File of unknown length, picking a char so each is equally probable?
解析
A. 两种方法:
- 给每张牌分配独立随机实数后排序()。
- Knuth/Fisher–Yates 洗牌():
for(i=1; i<=n; i++)
swap(A[i],A[Random(i,n)]);B. 蓄水池抽样(reservoir sampling,容量 1):
- 先选第 1 个字符;
- 读到第 个字符时,以概率 用它替换当前选择。
最终每个字符被选中的概率都是 。
Original Explanation
AnswerA:
- Sort approach: assign each card a random real , then sort => .
- Knuth shuffle:
for(i=1; i<=n; i++)
swap(A[i],A[Random(i,n)]);AnswerB:
Pick the first char, then for the 2nd char keep old with prob 1/2, else new. For the 3rd keep old with prob 2/3, else new, etc. Each char has chance.