一个简单的扑克牌洗牌算法|无重复

1.最初的想法:    

 第一个数:随机产生一个1-52 之间的数;

 第二个数:随机产生一个,和第一个比较,如果相同,就再产生一个随机的,直到不同为止;

 第三个数:随机产生一个,和第一、第二个比较,如果相同,就再产生,直到不同为止;

    ......以此类推,递归下去,很复杂,效率很低。

 (我还不会实现,下面的代码还是有重复的:)





2.换种思路,扑克牌就是1-52这52个数,先顺序存储:


然后再把有序的数组打乱顺序不就好了么!

算法如下:

输出就乱序了,且没有重复。

3.哈希映射的方法:

新建一个hashtable,一个output数组,随机生成一个数num,到hashtable中查,hashtable[$num]是否存在,如果不存在,则把num存到output数组,否则如果已存在,就用while循环重新生成num,知道hashtable[$num]不存在为止,再把num值存到output数组中,同时,设置hashtable[$num]值为1(表示这个数已存在);执行52次,则生成全部无重复的数,洗牌成功!

 0)
                {
                    $num = mt_rand(0, 51);
                }
                $output[$i] = $num;
                $hashtable[$num] = 1;
            } 
            return $output;
        }
?>




你可能感兴趣的:(ACM)