Leetcode 382. 链表随机节点
蓄水池抽样
问题描述:在不知道样本总量的情况下如何在一遍遍历中随机抽样,使得每个样品被取到的概率相同。
假设我们当前遍历到第k件样品,那么i\leq k件物品每件被抽到的概率为1/k,我们只需要每件物品在n次抽样中保证抽中一次,那么在接下来的n - k次抽样中第i件物品不被抽中。
概率为:
$\frac{1}{k}×(1-\frac{1}{k+1})×(1-\frac{1}{k+2})×…×(1-\frac{1}{n}) = \frac{1}{n}$
可以保证在n次抽样中每件物品被抽中的概率为1/n
代码:
class Solution {
ListNode head;
Random random;
public Solution(ListNode head) {
this.head = head;
this.random = new Random();
}
public int getRandom() {
ListNode headtemp = this.head;
int count = 0;
int res = 0;
while(headtemp != null) {
count++;
int randomint = random.nextInt(count) +1;
if(randomint == count)
//选中第count件的概率是1/count
//要注意下一次count++之后,判断的是选中count+1件。
res = headtemp.val;
headtemp = headtemp.next;
}
return res;
}
}