一步一步写算法(之洗牌算法)
【 聲明:版權全部,歡迎轉載,請勿用于商業用途。 ?聯系信箱:feixiaoxing @163.com】
?? ?撲克牌洗牌是我們生活中比較喜歡玩的一個游戲。那么我們有沒有什么辦法自己設計一個撲克牌洗牌的方法呢?在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) {int index;int value;int median;if(NULL == array || 0 == length)return ;/* 每次發牌的時候隨意分配待交換的數據 */for(index = 0; index < length; index ++){value = rand() % length;median = array[index];array[index] = array[value];array[value] = median;} }?? ?上面的算法很easy,可是有一個問題,我們發現每次洗牌之后原來洗好的牌都會進行二次操作,個人認為有點說只是去,所以最好還是加以改進:
?? ?a)相同,首先我們生成一個大小為54的數組,數組排列為1~54
?? ?b)索引牌從1開始,到54結束。這一次索引牌僅僅和剩下還沒有洗的牌進行交換, value = index + rand() %(54 - index)
?? ?c)等到全部的索引牌都洗好之后,一副牌就弄好了
?? ?代碼例如以下所看到的:
void get_rand_number(int array[], int length) {int index;int value;int median;if(NULL == array || 0 == length)return ;/* 發牌的時候對于已經分配的數據不再改動 */for(index = 0; index < length; index ++){value = index + rand() % (length - index);median = array[index];array[index] = array[value];array[value] = median;} }注: 以上兩個算法都不是我想出來的,歡迎算法的初始作者和我聯系,我會在文章中加入標記說明。
總結
以上是生活随笔為你收集整理的一步一步写算法(之洗牌算法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浅谈:ArrayList,ListT,L
- 下一篇: 小米POCO C55正式发布!起售价仅需