洗扑克牌的算法

时间:2021-05-22 11:11:12

洗扑克牌的原理其实与乱数排列是相同的,都是将一组数字(例如1~N)打乱重新排列,只不过洗扑克牌多了一个花色判断的动作而已。
初学者通常会直接想到,随机产生1~N的乱数并将之存入阵列中,后来产生的乱数存入阵列前必须先检查阵列中是否已有重复的数字,如果有这个数就不存入,再重新产生下一个数,运气不好的话,重复的次数就会很多,程式的执行速度就很慢了,这不是一个好方法。
以1~52的乱数排列为例好了,可以将阵列先依序由1到52填入,然后使用一个回圈走访阵列,并随机产生1~52的乱数,将产生的乱数当作索引取出阵列值,并与目前阵列走访到的值相交换,如此就不用担心乱数重复的问题了,阵列走访完毕后,所有的数字也就重新排列了。
至于如何判断花色?这只是除法的问题而已,取商数判断花色,取余数判断数字,您可以直接看程式比较清楚。


php代码实现如下:

<?phpclass wash_cards
{
    function __construct()
    {
       $n = 52;
       $poker = array(); 

        // 初始化阵列 
        for($i = 1; $i <= $n; $i++)
        {
            $poker[$i] = $i;
         }

        // 洗牌 
        for($i = 1; $i <= $n; $i++) 
        {
           $j = mt_rand() % 52 + 1;
           $tmp = $poker[$i];
           $poker[$i] = $poker[$j]; 
           $poker[$j] = $tmp; 
        }

        for($i = 1; $i <= $n; $i++) 
        {
            // 判断花色 
            switch(intval(($poker[$i]-1) / 13)) 
            { 
                //每13一循环,但13的倍数仍是该循环对应的花色,所以poker[i]要-1
                case 0: 
                    echo iconv('utf-8', 'gbk', "桃"); 
                    break;
                case 1: 
                    echo iconv('utf-8', 'gbk', "心"); 
                    break;
                case 2: 
                    echo iconv('utf-8', 'gbk', "砖"); 
                    break;
                case 3: 
                    echo iconv('utf-8', 'gbk', "梅"); 
                    break;
            } 

            // 扑克牌数字 
            $remain = $poker[$i] % 13;
            switch($remain) 
            { 
                case 0: 
                    $remain = 'K'; 
                    break;
                case 12: 
                    $remain = 'Q'; 
                    break;
                case 11: 
                    $remain = 'J'; 
                    break;
                default:
            } 
            echo $remain;
            if(strlen($remain) == 1)
            {
                echo '   ';    
            }
            else
            {
                echo '  ';        
            }
            
            if($i % 13 == 0)
                echo "\n";
        }
    }
}

new wash_cards();