Python洗牌演算法重寫

2022-08-03 07:51:12 字數 1084 閱讀 6027

python有自帶的洗牌演算法函式shuffle().

自己也通過學習也琢磨了一下它的實現,然後給出乙個時間複雜度o(n),空間複雜度o(4)的例子:

1

import

random23

defshuffle1(lst) :

4 l =len(lst)

5if l <= 1 : return

lst6

7 i =0

8while l > 1:

9 j = int(random.random() *l)

10 t =lst[i]

11 lst[i] = lst[i+j]

12 lst[i+j] =t

13 i = i + 1

14 l = l - 1

1516

return lst

執行結果:

1 b = [0,1,2,3,4,5,6,7,8,9]2

print shuffle1(b)

34 [9, 5, 7, 1, 8, 2, 3, 6, 0, 4

]5 [2, 4, 7, 3, 8, 5, 6, 9, 0, 1

]6 [3, 0, 8, 7, 1, 6, 5, 4, 9, 2

]7 [5, 8, 2, 9, 7, 1, 4, 0, 3, 6

]8 [7, 8, 0, 3, 9, 6, 1, 2, 4, 5

]9 [2, 4, 8, 7, 3, 6, 1, 0, 9, 5

]10 [2, 5, 9, 8, 4, 3, 0, 6, 1, 7

]11 [6, 0, 1, 9, 2, 3, 4, 7, 5, 8

]12 [5, 4, 0, 8, 6, 7, 9, 2, 3, 1

]13 [3, 9, 2, 8, 5, 7, 6, 1, 0, 4]

後面再琢磨能不能降低一下時間複雜度。

比如洗4副牌,可以開4個執行緒同時洗,通過並行提高效能。

也可以乙個執行緒洗,每次以4張或者更大數目切牌,也能達到較好的效果。

每日演算法 洗牌演算法

給定乙個n個數的序列,設計乙個演算法將其隨機打亂,保證每個數出現在任意乙個位置的概率相同 也就是說在n 個的排列中,每乙個排列出現的概率相同 假設輸入為陣列num length 隨機選乙個數,放到num 0 中,再隨機選數,如果該數已經選過,重新選,直到該數未選過時放入num 1 中,以此類推,直到...

洗牌演算法小結

1.for i 1 to n do swap a i a random 1,n 湊合,但不是真正隨機 2.for i 1 to n do swap a i a random i,n 真正的隨機演算法 其中,random a,b 函式用於返回乙個從a到b 包括a和b 的隨機整數。第乙個 概率事件總的發...

隨機洗牌演算法

問題 給定乙個有序序列1 n,要你將其完全打亂,要求每個元素在任何乙個位置出現的概率均為1 n。解決方案 依次遍歷陣列,對第n個元素,以1 n的概率與前n個元素中的某個元素互換位置,最後生成的序列即滿足要求,1 n的概率可通過rand n實現。見如下程式 void swap int p,int q ...