Leetcode 382. 链表随机节点

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;
  }
}

 

 

posted @ 2022-01-17 11:38  Dre_am_tale  阅读(23)  评论(0编辑  收藏  举报