洗牌演算法小結

2021-05-26 04:48:55 字數 977 閱讀 5210

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)的隨機整數。

第乙個**:概率事件總的發生情況有n^n種,第二個**:概率事件總的發生情況有n!種。

似乎第二個演算法是當前比較流行的洗牌演算法。

在c++的stl庫中有洗牌演算法:

template

void random_shuffle(

randomaccessiterator _first, 

randomaccessiterator _last

);template

void random_shuffle(

randomaccessiterator _first, 

randomaccessiterator _last, 

randomnumbergenerator& _rand

);它的三個引數

_first  要進行該演算法的序列的起始迭代器(泛型指標)

_last  要進行該演算法的序列的終止迭代器(泛型指標)

_rand  特定(自定)的隨機數產生器,好像是乙個類

在php中也有洗牌演算法

bool

shuffle( array

&$array

)shuffle() 函式把陣列中的元素按隨機順序重新排列。

若成功,則返回 true,否則返回 false。

注釋:本函式為陣列中的單元賦予新的鍵名。這將刪除原有的鍵名而不僅是重新排序。

注釋:自 php 4.2.0 起,不再需要用 srand() 或 mt_srand() 函式給隨機數發生器播種,現已被自動完成。

參見:1,

2,

每日演算法 洗牌演算法

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

隨機洗牌演算法

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

完美洗牌演算法

原文 完美洗牌問題 給定乙個陣列a1,a2,a3,an,b1,b2,b3.bn,把它最終設定為b1,a1,b2,a2,bn,an這樣的。分析 首先,有的問題要求把它換成a1,b1,a2,b2,an,bn。其實也差不多。我們可以 迴圈n次交換a1,b1,a2,b2,把陣列變為b1,b2.bn,a1,a...