- (簡答題)有一個大文件,只掃描一遍的情況下,等概率返回其中一行
順次掃描文件的時候,第一行的時候,返回這一條數據,第二行以1/2的概率用第二行的數據替換這條數據,以此類推,在第n行的時候,以1/n的概率用這一行數據替換之前的結果。最終的數據作爲返回結果。
將這n個元素依次遍歷,每次得到的數(第L個)取隨機數r,r%L==0(0-L之內)
1,2,3,4,5,6,7
第一個數:pick = 1 概率100%;
第二個數:pick被替換爲第二個數的概率爲1/2,前面的數選到概率爲1/2
第三個數:pick被替換爲第三個數的概率爲1/3,前面的數選到概率爲1/2*(1-1/3)
第四個數:pick被替換爲第四個數的概率爲1/4,之前概率爲1/3*(1-1/4)
……
第n個數:pick被替換爲第n個數的概率爲1/n
var pickOne(file){
int lenth = 1;
while(lenth <= file.size){
if(random()%lenth == 0){
pick = file[lenth];
}
lenth++;
}
return pick;
}