python有自帶的洗牌演算法函式shuffle().
自己也通過學習也琢磨了一下它的實現,然後給出乙個時間複雜度o(n),空間複雜度o(4)的例子:
1import
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]2print 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 ...