1. 程式人生 > 其它 >功能測試常見的測試方法有哪些?

功能測試常見的測試方法有哪些?

1.從100張牌裡隨機抽一張,這很簡單吧,rand隨機就行了。

2.從100張牌中抽50張牌,要求不重複呢。最簡單的思路就是反覆rand,並且將rand存入到hash表中,如果重複就在來一次,直到50次不重複。

3.從100張牌中抽99張不同的牌呢,那2的思路就很困難了,越到後面重複的概率越大,越耗時間。

接下來就到洗牌演算法登場了。

這個演算法的核心思路就是:將最後一個數和前面任意 n-1 個數中的一個數進行交換(也可以不換),然後倒數第二個數和前面任意 n-2 個數中的一個數進行交換,如此往復直到最後一個元素,就完成了洗牌,該演算法保證了每個元素在每個位置的概率都是相等的。

我們舉例子來說明:1,2,3,4,5

第一次交換,1,2,3,4,5出現在第五個位置的概率為1/5。假設我們交換的是2,序列變為1,5,3,4,2。

第二次交換,1,5,3,4出現在第四個位置的概率為1/4,同時第一次沒有選中他們的概率為4/5,所以最後的概率還是1/5。假設交換的序列為4,5,3,1。

第三次交換,4,5,3出現在第三個位置的概率為1/3,同時需要乘上第一次沒被選中和第二次沒被選中的概率,分別為4/5和3/4。最後概率還是1/5。

相信後面不需要推演了,大家應該都能知道這個演算法的厲害之處了。

程式碼:

for(int i = n-1; i >= 0 ; --i){
    swap(arr[i],arr[rand()%(i+1)]);
}

洗牌的速度是o(n)哦。