日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

随机洗牌

發(fā)布時間:2025/4/9 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 随机洗牌 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

問題:給定一個有序序列1~n,要你將其完全打亂,要求每個元素在任何一個位置出現(xiàn)的概率均為1/n。

解決方案:依次遍歷數(shù)組,對第n個元素,以1/n的概率與前n個元素中的某個元素互換位置,最后生成的序列即滿足要求,1/n的概率可通過rand() % n實現(xiàn)。見如下程序:

void swap(int* p, int* q)

{

????int tmp = *p;

????*p = *q;

????*q = tmp;

}

?

void shuffle(int *arr, int n)

{

????int i;

????for(i = 0; i < n; i++) {

????????int idx = rand() % (i + 1); //選取互換的位置

????????swap(&arr[idx], &arr[i]);

????}

}

?

?使用數(shù)學(xué)歸納法證明:

l??當(dāng)n=1時,idx必為0,所以元素arr[0]在任何一個位置的概率為1/1,命題成立。

l??假設(shè)當(dāng)n=k時,命題成立,即n=k時,原數(shù)組中任何一個元素在任何一個位置的概率為1/k。

?則當(dāng)n=k+1時,當(dāng)算法執(zhí)行完k次時,前k個元素在前k個位置的概率均為1/k。

?當(dāng)執(zhí)行最后一步時,前k個元素中任何一個元素被替換到第k+1位置的概率為:(1-1/(k+1)) * 1/k = 1/(k+1);?在前面k個位置任何一個位置的概率為(1-1/(k+1)) * 1/k = 1/(k+1);

故前k個元素在任意位置的的概率都為1/(k+1)

?所以,對于前k個元素,它們在k+1的位置上概率為1/(k+1)。

?對于第k+1個元素,其在原位置的概率為1/k+1,在前k個位置任何一個位置的概率為:(1-k/(k+1))?* (1/k)=1/(k+1),所以對于第k+1個元素,其在整個數(shù)組前k+1個位置上的概率也均為1/k+1。

?綜上所述,對于任意n,只要按照方案中的方法,即可滿足每個元素在任何一個位置出現(xiàn)的概率均為1/n。

?

擴展:一道google面試題

給定一個未知長度的整數(shù)流(數(shù)目大于1000),如何從中隨機選取1000個隨機數(shù)。

?

解決方法:

l??定義長度為1000的數(shù)組,對于數(shù)據(jù)流中的前1000個關(guān)鍵字,顯然都要放到數(shù)組中。

l??對于數(shù)據(jù)流中的的第n(n>1000)個關(guān)鍵字,則這個關(guān)鍵字被隨機選中的概率為?1000/n。故以?1000/n?的概率用這個關(guān)鍵字去替換數(shù)組中的一個。這樣就可以保證所有關(guān)鍵字都以?1000/n的概率被選中。對于后面的關(guān)鍵字都進(jìn)行這樣的處理,這樣就可以保證數(shù)組中總是保存著1000個隨機關(guān)鍵字。

?

注:以1000/n的概率選擇一個數(shù)替換,可通過rand() % n實現(xiàn),則這個數(shù)被替換到前1000個位置中的概率為1000/n。

轉(zhuǎn)自:http://blog.chinaunix.net/uid-20196318-id-216658.html

轉(zhuǎn)載于:https://www.cnblogs.com/freeopen/p/5482894.html

總結(jié)

以上是生活随笔為你收集整理的随机洗牌的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。