洗牌演算法(打亂撲克牌順序)

2022-08-20 21:54:07 字數 1393 閱讀 2599

問題描述:有乙個大小為 n 的有序陣列,如何打亂元素順序,使得任一元素在陣列的任一位置出現的概率都為 1/n?也就是說對於大小為 n 的有序陣列,有 n!種排列方式,要求能等概率的得到這 n!種結果。

思路一:每次從原始陣列中隨機取乙個之前未取過的元素,新增到新陣列中。選取方法是:生成乙個 1~rem 的隨機數 i,rem 為還未新增的元素個數,將第 i 個元素新增到新陣列中,然後從原始陣列中刪除該元素。

時間複雜度:

o(n

2)

o(n^2)

o(n2)

空間複雜度:o(

n)

o(n)

o(n)

import random

def func(arr):

n = len(arr)

rem = n

new =

for i in range(n):

p = random.randint(1, rem) # randint的隨機範圍是[a,b]閉區間

del arr[p-1]

rem -= 1

return new

if __name__ == '__main__':

arr = ['a', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'j', 'q', 'k']

print(func(arr))

思路二:在思路一的基礎上,其實不用每次都將原陣列的元素刪除,再新增進新的陣列。只需要將選取的元素與當前陣列的末尾元素交換即可,適用於允許更改原陣列的情況。

時間複雜度:

o(n

)o(n)

o(n)

空間複雜度:o(

1)

o(1)

o(1)

import random

def func(arr):

n = len(arr)

rem = n

for i in range(n):

p = random.randint(1, rem) # randint的隨機範圍是[a,b]閉區間

arr[p-1], arr[rem-1] = arr[rem-1], arr[p-1]

rem -= 1

return arr

if __name__ == '__main__':

arr = ['a', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'j', 'q', 'k']

print(func(arr))

洗牌 發牌演算法 打亂撲克牌順序

洗牌的演算法有很多,這裡主要介紹下幾種主要的演算法。方法一 每次找乙個隨機的位置,然後將這54個數放到找的位置中。步驟 1.用乙個整型陣列記錄各個位置是否已經放置了數,如果放置了則不為0,否則為0。所以在演算法開始的時候,初始化此陣列每個元素的值都為0.2.每次產生乙個0 53之間的數,看這個位置是...

撲克牌洗牌演算法 random shuffle

撲克牌洗牌有多種演算法 第1個 每次從原陣列a取出範圍 1,i 的數放入b陣列。缺點是每次都要將陣列i後面的元素進行移動。是乙個o n2 演算法 void xipai int n n for int i 1 i x i 第2種 每次取範圍 1,i 1 的數,然後與最後乙個元素做交換。這樣的複雜度優化...

撲克牌洗牌樣例

從網上摘抄的乙個洗牌程式的樣例 清雨空間與您分享程式設計的樂趣 以下是乙個基於c語言編寫的隨機 洗牌程式,程式先按順序生成一副紙牌,顯示紙牌,輸入洗牌次數,開始隨機洗牌,顯示洗牌結果 program by norm jen,include include includeint card 2 52 i...