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

2021-09-26 02:42:37 字數 594 閱讀 5269

洗牌的基本邏輯,是乙個已知陣列重排序的問題,所以簡單的做法是遍歷k次,每次交換兩張牌,但是這個演算法公平嗎?

如何確定乙個演算法公平,假設有n張牌,那麼就有n!中排序方法,而我們應該從這n!次中隨機1個,這樣才能保證公平性

但是這個演算法複雜度太高了!!!

那麼怎麼簡單呢?

換一種思維,每個位置都能等概率的存放每個元素

第一次,隨機n個元素,放到第一位,即 第一位的元素有1/n的概率

第二次,隨機剩下的n-1個元素,放到第二位,第二位元素的概率為 (n-1)/n * 1/(n-1) = 1/n

這樣每個位置產生的數概率完全相同,都是1/n,這樣就保證了隨機性

local arr = [1,2,3,4,5]

local len = 5

funtion swap(index1,index2)

for i=n,-1 do

local randomindex = math.random(1,i+1);

swap(randomindex,i);

end

每次隨機取下標1-i,然後與第i位交換位置

這就是knuth洗牌演算法

乙個簡單的洗牌演算法

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

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

給定n張撲克牌和乙個隨機函式,設計乙個洗牌演算法 我們有乙個隨機函式發生器,能夠產生1 54之間的隨機數,如何保證抽第一張牌是54中可能,抽第二張牌是53中可能 需要實每次取完元素後,我們就不會讓這個元素參與下一次的選取。那麼第一次抽牌在初始54張牌中,將隨機產生的牌x,與第乙個元素互換,第二次抽牌...

一天乙個演算法 隨機洗牌演算法

洗牌演算法是我們常見的隨機問題,在玩遊戲 隨機排序時經常會碰到。它可以抽象成這樣 得到乙個m以內的所有自然數的隨機順序陣列。洗牌演算法大多都是建立在隨機數的基礎上的,現在介紹幾種隨機數基礎上的隨機洗牌演算法 1 第一種可以簡單描述成 隨機抽牌,放在另一組 再次抽取,抽到空牌則重複抽。抽到空牌則重新抽...