撲克洗牌算法

撲克牌洗牌是咱們生活中比較喜歡玩的一個遊戲。那麼咱們有沒有什麼辦法本身設計一個撲克牌洗牌的方法呢?在c運行庫當中有一個隨機函數rand,它能夠生成0~32767之間的任意數。那麼有沒有可能利用這麼一個函數對咱們撲克牌進行隨即洗牌呢?算法

    在這裏我拋磚引玉一下,談一談本身目前已經看到的兩個算法。歡迎朋友們談一談其餘的方法。數組

    (1)全局洗牌法函數

    步驟以下所示:.net

    a)首先生成一個數組,大小爲54,初始化爲1~54設計

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

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

    代碼以下所示:遊戲

 

[cpp] view plain copyget

  1. void get_rand_number(int array[], int length)  
  2. {  
  3.     int index;  
  4.     int value;  
  5.     int median;  
  6.   
  7.     if(NULL == array || 0 == length)  
  8.         return ;  
  9.   
  10.     /* 每次發牌的時候任意分配待交換的數據 */  
  11.     for(index = 0; index < length; index ++){  
  12.         value = rand() % length;  
  13.   
  14.         median = array[index];  
  15.         array[index] = array[value];  
  16.         array[value] = median;  
  17.     }  
  18. }  

 

 

    (2)局部洗牌法方法

    上面的算法很是簡單,可是有一個問題,咱們發現每次洗牌以後原來洗好的牌都會進行二次操做,我的以爲有點說不過去,因此不妨加以改進:

    a)一樣,首先咱們生成一個大小爲54的數組,數組排列爲1~54

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

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

    代碼以下所示:

 

[cpp] view plain copy

  1. void get_rand_number(int array[], int length)  
  2. {  
  3.     int index;  
  4.     int value;  
  5.     int median;  
  6.       
  7.     if(NULL == array || 0 == length)  
  8.         return ;  
  9.       
  10.     /* 發牌的時候對於已經分配的數據再也不修改 */  
  11.     for(index = 0; index < length; index ++){  
  12.         value = index + rand() % (length - index);  
  13.           
  14.         median = array[index];  
  15.         array[index] = array[value];  
  16.         array[value] = median;  
  17.     }  
  18. }  
相關文章
相關標籤/搜索