一个简单的扑克牌洗牌算法|无重复
来源:互联网 发布: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; }?>
- 一个简单的扑克牌洗牌算法|无重复
- 【算法】扑克牌52张,无重复洗牌算法
- 52张扑克牌的洗牌算法
- 扑克牌 洗牌算法 的java实现
- 扑克牌 洗牌算法
- 扑克牌洗牌算法
- 扑克牌洗牌算法
- 洗牌的一个算法
- 一个简单的扑克牌小游戏
- 模拟扑克牌的洗牌发牌
- 一个很小的洗牌算法
- 给定N张扑克牌和一个随机函数,设计一个洗牌算法
- 给定N张扑克牌和一个随机函数,设计一个洗牌算法
- 给定N张扑克牌和一个随机函数,设计一个洗牌算法
- 给定N张扑克牌和一个随机函数,设计一个洗牌算法
- 给定N张扑克牌和一个随机函数,设计一个洗牌算法
- 给定N张扑克牌和一个随机函数,设计一个洗牌算法
- 洗牌、发牌算法 (打乱扑克牌顺序)
- C#防SQL注入
- HDU 2191 悼念512汶川大地震遇难同胞
- 笔试:输出712的n次方结果后三位为696的个数
- 程序员_Java初级<四>数组、进制转换函数
- Eclipse颜色设置
- 一个简单的扑克牌洗牌算法|无重复
- unix和dos文本文件的区别
- 我希望在20岁时就知道的26条时间管理技巧
- Java_GUI (2)
- NYOJ 86 找球号(一)
- 不使用sizeof, 计算int的位数
- Statspack 安装和使用
- Android StartActivity时候出现的requires new task 异常解析
- 转换字符串格式为原来字符串里的字符+该字符连续出现的个数