面试题收集

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足够大,使误差可忽略
>.<

 

posted @ 2013-10-10 14:53  懒猫欣  阅读(116)  评论(0编辑  收藏  举报