程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 一步一步寫算法(之洗牌算法)

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

編輯:關於C語言

 

【 聲明:版權所有,歡迎轉載,請勿用於商業用途。  聯系信箱: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; 

    } 

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;

       }

}

 

 

 

 

    (2)局部洗牌法

    上面的算法非常簡單,但是有一個問題,我們發現每次洗牌之後原來洗好的牌都會進行二次操作,個人覺得有點說不過去,所以不妨加以改進:

 

    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; 

    } 

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;

       }

}

 

 

注: 以上兩個算法都不是我想出來的,歡迎算法的初始作者和我聯系,我會在文章中添加標記說明。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved