【random取概率】有一個大文件,只掃描一遍的情況下,等概率返回其中一行

  • (簡答題)有一個大文件,只掃描一遍的情況下,等概率返回其中一行

順次掃描文件的時候,第一行的時候,返回這一條數據,第二行以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;

}

參考:https://www.cnblogs.com/pandans/p/5002031.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章