問題描述:有乙個大小為 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...