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

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;
        }
?>




©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值