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

来源:互联网 发布:h5源码 编辑:程序博客网 时间:2024/04/28 00:31

1.最初的想法:    

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

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

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

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

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

<?php $arr=poker();sort($arr);var_dump($arr);  function poker(){  $arr[0]=mt_rand(0, 51);  for($i=1;$i<52;$i++){  $arr[$i]=mt_rand(0, 51);  for($j=0;$j<$i;$j++){//新生成的数还要回去比,如果存在重复,在比较。。。代码  while($arr[$i]==$arr[$j]){  $arr[$i]=mt_rand(0, 51);  }  }  }  return $arr;  }  ?>




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


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

算法如下:

<?php for($i=0;$i<52;$i++){$arr[$i]=$i+1;}$N = 100;              //假设重复对调 100 次for($i=0;$i<$N;$i++){$a = mt_rand(0, 51);//随机选取两个单元下标$b = mt_rand(0,51);//区间范围 0 ~ 51$temp = $arr[$a];     //经典的两数交换$arr[$a] = $arr[$b];$arr[$b] = $temp;}var_dump($arr);?>

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

3.哈希映射的方法:

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

<?php $arr=poker();var_dump($arr);     function poker()        {           $hashtable = array();           $output=array();            for ($i=0;$i<52;$i++)            {                $num = mt_rand(0,51);                while (@$hashtable[$num] > 0)                {                    $num = mt_rand(0, 51);                }                $output[$i] = $num;                $hashtable[$num] = 1;            }             return $output;        }?>




原创粉丝点击