一步一步寫演算法(之洗牌演算法)

2021-09-06 18:06:41 字數 840 閱讀 5512

撲克牌洗牌是我們生活中比較喜歡玩的乙個遊戲。那麼我們有沒有什麼辦法自己設計乙個撲克牌洗牌的方法呢?在c執行庫其中有乙個隨機函式rand,它能夠生成0~32767之間的隨意數。那麼有沒有可能利用這麼乙個函式對我們撲克牌進行隨即洗牌呢?

在這裡我拋磚引玉一下,談一談自己眼下已經看到的兩個演算法。歡迎朋友們談一談其它的方法。

(1)全域性洗牌法

過程例如以下所看到的:

a)首先生成乙個陣列,大小為54,初始化為1~54

b)依照索引1到54,逐步對每一張索引牌進行洗牌,首先生成乙個餘數 value = rand %54,那麼我們的索引牌就和這個餘數牌進行交換處理

c)等多索引到54結束後,一副牌就洗好了

**例如以下所看到的:

void get_rand_number(int array, int length)

}

(2)區域性洗牌法

上面的演算法很easy,可是有乙個問題,我們發現每次洗牌之後原來洗好的牌都會進行二次操作,個人認為有點說只是去,所以最好還是加以改進:

a)相同,首先我們生成乙個大小為54的陣列,陣列排列為1~54

b)索引牌從1開始,到54結束。這一次索引牌僅僅和剩下還沒有洗的牌進行交換, value = index + rand() %(54 - index)

c)等到全部的索引牌都洗好之後,一副牌就弄好了

**例如以下所看到的:

void get_rand_number(int array, int length)

}

一步一步寫演算法(之洗牌演算法)

在這裡我拋磚引玉一下,談一談自己目前已經看到的兩個演算法。歡迎朋友們談一談其他的方法。1 全域性洗牌法 步驟如下所示 a 首先生成乙個陣列,大小為54,初始化為1 54 b 按照索引1到54,逐步對每一張索引牌進行洗牌,首先生成乙個餘數 value rand 54,那麼我們的索引牌就和這個餘數牌進行...

一步一步寫演算法(之洗牌演算法)

在這裡我拋磚引玉一下,談一談自己目前已經看到的兩個演算法。歡迎朋友們談一談其他的方法。1 全域性洗牌法 步驟如下所示 a 首先生成乙個陣列,大小為54,初始化為1 54 b 按照索引1到54,逐步對每一張索引牌進行洗牌,首先生成乙個餘數 value rand 54,那麼我們的索引牌就和這個餘數牌進行...

一步一步寫演算法(之 A 演算法)

在前面的部落格當中,其實我們已經討論過尋路的演算法。不過,當時的示例圖中,可選的路徑是唯一的。我們挑選乙個演算法,就是說要把這個唯一的路徑選出來,怎麼選呢?當時我們就是採用窮盡遞迴的演算法。然而,今天的情形有點不太一樣了。在什麼地方呢?那就是今天的路徑有n條,這條路徑都可以達到目的地,然而我們在挑選...