1.给一个长为n的链表,如何只扫描链表一次从中随机算出m个数(m<n),并证明每个数都等概率
使用一个m长的数组,首先装入前m位,后面的进行随机。 第i位取随机数范围0-i。如果随机数小于m则替换掉响应的。 等概率证明: 前m个数中,每个数被选中的概率就是该数不被剩下的数换出去的概率,即 (m/m+1)*(m+1/m+2)*...*(n-1/n) 化简后为m/n 后n-m个数中,每个数被选中的概率就是该数被换入,且不被后面的数换出的概率,设该数为i,则概率为m/i*(i/i+1)*(i+1/i+2)*...*(n-1/n)化简后为m/n
2.给一个产生1-n的随机数生成器,如何构造一个1-m的随机数生成器
用一个k位n进制数 表示范围是1-n^k ,如果不要求终止,则扔掉后n^k%m个 。
否则的话去k足够大,使误差可忽略