c 面試高頻3 設計乙個洗牌演算法

2021-10-08 16:56:14 字數 510 閱讀 6047

給定n張撲克牌和乙個隨機函式,設計乙個洗牌演算法

我們有乙個隨機函式發生器,能夠產生1-54之間的隨機數,如何保證抽第一張牌是54中可能,抽第二張牌是53中可能……需要實每次取完元素後,我們就不會讓這個元素參與下一次的選取。 那麼第一次抽牌在初始54張牌中,將隨機產生的牌x,與第乙個元素互換,第二次抽牌在剩下的53張牌中,將隨機產生的牌y,與第二個元素互換,注意互換後的牌不參與隨機選取。

for(int i = 0;i < n;i++)

個人認為這種題沒見過不好寫,見過下次就能寫出來,多多積累吧

#include#include#include //注意傳引用

void swap(int &a,int &b)

void randomshuffle(int a, int n)

}int main()

randomshuffle(a,54);

return 0;

}

設計乙個公平的洗牌演算法

洗牌的基本邏輯,是乙個已知陣列重排序的問題,所以簡單的做法是遍歷k次,每次交換兩張牌,但是這個演算法公平嗎?如何確定乙個演算法公平,假設有n張牌,那麼就有n 中排序方法,而我們應該從這n 次中隨機1個,這樣才能保證公平性 但是這個演算法複雜度太高了!那麼怎麼簡單呢?換一種思維,每個位置都能等概率的存...

乙個簡單的洗牌演算法

首先我們需要寫乙個 生成指定區間內的隨機數 的函式 因為陣列索引都是整數,所以我們需要對隨機的結果再向下取整 返回乙個 min,max 之間的隨機數 function getrandomint min,max math.random 會生成乙個 0,1 之間的number 然後我們需要遍歷陣列,對每...

OOD 高頻面試題 如何設計乙個ATM

如何設計乙個 atm machine 如何設計乙個atm machine?首先,這是一道real life object的題目,類似題型 vending machine 一 clarify assumption input 是卡,output 是現金assumption 只能是debit carda...