隨機洗牌演算法

2021-08-26 11:00:26 字數 888 閱讀 7577

先看看肖舸老師的文章:《隨機洗牌演算法複雜度的比較例項》

其實我最初想到的也是那3個方法:1判斷生成的隨機數有沒有重複,2.生成一張布林表,3.雙隨機數。

下面給出我的演算法:

#include #include #include using namespace std; void randcard(vector, int); //函式宣告 int main(int argc, char *argv) void randcard(vectornretcard, int ncards) { int i, j, temp; for(i=0; i其思路很簡單,每次從向量中隨機取乙個數出來,利用vevtor向量的自動調整長度,每次刪除乙個元素,再用新的向量長度j生成隨機數:temp=rand()%j; 顯然演算法的時間複雜度為o(n),即一趟for迴圈,不存在最壞情況。

如果是php語言,那麼它自帶了乙個隨機洗牌的函式,即shuffle(),它的作用是隨機地對陣列元素重新排序。其形式為:

void shuffle(array input_array)

考慮乙個陣列,其中包含撲克牌的值:

$cards = array("jh","js","jd","jc","qh","qs","qd","qc","kh","ks","kd","kc","ah","as","ad","ac"); $positions=shuffle($cards); print_r($positions); //輸出隨機排序後的結果

另外php中的array_rand()函式可從陣列中隨機出乙個或多個鍵,其形式為:

mixed array_rand(array array [, int num_entries] )

如果忽略可選的num_entries引數,則只返回乙個隨機值。可以通過設定num_entries來調整返回隨機值的個數。

隨機洗牌演算法

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

隨機演算法入門 洗牌演算法

洗牌演算法是什麼?其實就理解為生成乙個隨機數列的乙個簡單操作而已。怎麼生成?我們先講下一般我們會想到的乙個解法 標記。怎麼標記呢?假設我們的陣列為a,ai 代表陣列a第i個數。乙個布林陣列b 其他型別的陣列也行 然後把a陣列下標作為狀態空間進行隨機生成,接著把生成過的數下標 i 用 bi 1表示為已...

陣列中隨機抽取 演算法 撲克隨機洗牌演算法分析

洗牌演算法實際上就是常見的隨機問題。我們可以抽象理解為 得到乙個m以內的所有自然數的隨機順序陣列。然而怎麼樣操作才是好的洗牌演算法呢?我們通常認為得保證概率相等。即洗牌之後,如果能夠保證每乙個數出現在所有位置上的概率是相等的。隨機抽出一張牌 檢查這種牌是否被抽取過,如果已經被抽取過,則重新抽取,直到...