php 扑克牌洗牌算法,随机洗牌算法 | 学步园
随机洗牌
其实我最初想到的也是那3个方法:1判断生成的随机数有没有重复,2.生成一张布尔表,3.双随机数。
下面给出我的算法:
#include
#include
#include
using namespace std;
void RandCard(vector, int); //函数声明
int main(int argc, char *argv[])
{
vector nRetCard;
int nCards=54;
RandCard(nRetCard, nCards);
return 0;
}
void RandCard(vector nRetCard, int nCards)
{
int i, j, temp;
for(i=0; i
{
nRetCard.push_back(i+1); //顺序生成初始值
}
srand(time(NULL));
for(i=0, j=nCards; i
{
temp=rand()%j; //从向量中随机取一个
cout<
if( !((i+1)%17) ) cout<
nRetCard.erase(nRetCard.begin()+temp); //删除用过的元素
}
}
其思路很简单,每次从向量中随机取一个数出来,利用vevtor向量的自动调整长度,每次删除一个元素,再用新的向量长度j生成随机数:temp=rand()%j; 显然算法的时间复杂度为O(n)(不考虑vevtor向量API的情况下),即一趟for循环,不存在最坏情况。
但是注意,该方法的写法虽然简单,但是调用了vevtor向量的API,所以其实效率并不是特别高,但一般情况下够用了。
如果是PHP语言,那么它自带了一个随机洗牌的函数,即shuffle(),它的作用是随机地对数组元素重新排序。其形式为:
void shuffle(array input_array)
考虑一个数组,其中包含扑克牌的值:
$cards = array("jh","js","jd","jc","qh","qs","qd","qc","kh","ks","kd","kc","ah","as","ad","ac");
$positions=shuffle($cards);
print_r($positions); //输出随机排序后的结果
另外PHP中的array_rand()函数可从数组中随机出一个或多个键,其形式为:
mixed array_rand(array array [, int num_entries] )
如果忽略可选的num_entries参数,则只返回一个随机值。可以通过设置num_entries来调整返回随机值的个数。
如果是Java语言,可以用我下面这个算法,效率是以上探讨过的方法中最高的,当然这个算法也可以用其他语言来实现,大概思路如下:
从0~size-1中产生一个随机数j,然后将a.[j]放到最末尾去(与最后一个未使用的数交换),
然后再从0~size-2中产生一个随机数k,然后将a.[k]放到倒数第二个位置(与最后一个未使用的数交换),
以此类推……最后,整个序列都被打乱了,而且数字成排列组合状态,不会有数字重复出现。
public static void main(String[] args) {
ArrayList pokerCards = new ArrayList(5);
pokerCards.add("A");
pokerCards.add("B");
pokerCards.add("C");
pokerCards.add("D");
pokerCards.add("E");
zolltyRandom(pokerCards);
printList(pokerCards);
ArrayList excList = new ArrayList(5);
excList.add(new Exception("A"));
excList.add(new Exception("B"));
excList.add(new Exception("C"));
excList.add(new Exception("D"));
excList.add(new Exception("E"));
zolltyRandom(excList);
printList(excList);
int orgIntArray[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15, 16, 17, 18, 19, 20, 21 };
int resultArray[] = zolltyRandom(orgIntArray);
printArray(resultArray);
}
/**
* 将原始数组重新随机排序(=洗牌)
*
* @param orgIntArray
* 例如{ 0, 1, 2, 3, 4, 5, 6, 7 }
* @return 排列后的数组
* @author zollty
*/
public static int[] zolltyRandom(int[] orgIntArray) {
Random rand = new Random();
int pos, temp2;
int returnValue[] = new int[orgIntArray.length];
for (int i = 0, r = orgIntArray.length; i < orgIntArray.length - 1; i++, r--) {
pos = Math.abs(rand.nextInt()) % r;
returnValue[i] = orgIntArray[pos];
// [pos]已使用,与最后那个未使用的交换
temp2 = orgIntArray[pos];
orgIntArray[pos] = orgIntArray[r - 1];
orgIntArray[r - 1] = temp2;
}
returnValue[orgIntArray.length - 1] = orgIntArray[0];
return returnValue;
}
/**
* 将ArrayList里面的元素随机排序(=洗牌)
*
* @param targetList
* 需要排序的"ArrayList"
* @author zollty
*/
@SuppressWarnings("unchecked")
public static void zolltyRandom(ArrayList targetList) {
Random rand = new Random();
int pos;
int size = targetList.size();
targetList.add(targetList.get(0)); // 即targetList.get(size) 作为temp元素
for (int i = 0, r = size; i < size - 1; i++, r--) {
pos = Math.abs(rand.nextInt()) % r;
// [pos]已使用,与最后那个未使用的交换
targetList.set(size, targetList.get(pos)); // 将[pos]的值暂时转移到[size]上
targetList.set(pos, targetList.get(r - 1));
targetList.set(r - 1, targetList.get(size));
}
targetList.remove(size); // 移除temp元素
}
public static void printArray(int[] arry) {
for (int j = 0; j < arry.length; j++) {
System.out.print(arry[j]);
if (j != arry.length - 1) {
System.out.print(",");
}
}
}
public static void printArray(String[] arry) {
for (int j = 0; j < arry.length; j++) {
System.out.println(j + " => " + arry[j]);
}
}
public static void printList(final List list) {
int size = list.size();
for (int j = 0; j < size; j++) {
System.out.println(j + " => " + list.get(j));
}
}
php 扑克牌洗牌算法,随机洗牌算法 | 学步园相关推荐
- python随机抽号_Python 创建扑克牌,并实现随机抽牌、排序、洗牌等功能
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 以下文章来源于Z先生点记,作者 zeroing 转载地址 https://mp. ...
- 重启随机游走算法(RWR:Random Walk with Restart)
重启随机游走算法(RWR:Random Walk with Restart) 1 pagerank算法的基本原理 Pagerank算法是Google的网页排名算法,由拉里佩奇发明.其基本思想是民主表决 ...
- 随机迷宫生成算法——深度优先算法
迷宫是我们小时候经常玩的游戏,如何用代码来快速生成上面这种迷宫呢? 迷宫算法有三大算法:深度优先算法.prim算法和递归分割算法.这里用的是深度优先算法,在此说一下算法思路,希望对各位有所帮助. 首先 ...
- 重启随机游走算法(RWR)
重启随机游走算法(Random Walk with Restart) 1 pagerank算法的基本原理 Pagerank算法是Google的网页排名算法,由拉里佩奇发明.其基本思想是民主表决.在互联 ...
- java利用复循环洗牌算法_随机洗牌算法
今天偶然看到群里的朋友说道,面试被问如何将扑克牌随机洗牌输出.笔者觉得这道题挺有意思而且挺开放性,有多种不同的实现方式.然后我就随手写了一个算法,仔细一想这个算法的优化空间挺大,于是又写出三种算法. ...
- 高纳德( Knuth)随机置乱算法,洗牌算法,等概率打乱顺序
先看道题: 从1-100里面随机选出10个的数,你可能会先将100个数存在数组中,用到Math.random函数得到随机下标,从而选出数. 那么如果让你选出10个不同的数呢,你可能会将选出的数先存起来 ...
- 随机洗牌算法 银行家算法
1. 随机洗牌算法 https://blog.csdn.net/qq_26399665/article/details/79831490 Fisher-Yates Shuffle算法 最早提出这个洗牌 ...
- 随机洗牌算法+matlab,洗牌算法及 random 中 shuffle 方法和 sample 方法浅析
对于算法书买了一本又一本却没一本读完超过 10%,Leetcode 刷题从来没坚持超过 3 天的我来说,算法能力真的是渣渣.但是,今天决定写一篇跟算法有关的文章.起因是读了吴师兄的文章<扫雷与算 ...
- C#:实现随机洗牌Knuth-Durstenfeld Shuffle算法(附完整源码)
C#:实现随机洗牌Knuth-Durstenfeld Shuffle算法 public static void Shuffle<T>(T[] a) {Random rnd = new Ra ...
- 等概率随机取数算法的几种实现(洗牌算法)
等概率随机取数算法的几种实现 最近读了项目中的工具脚本,发现一个随机取数的函数,功能大概是从M个数中不重复的随机取出N个数,算是数组随机排序然后取前N个值的变种. 脚本实现采取原始的方法,每随机取一个 ...
最新文章
- JMeter的安装和使用
- SpringBoot的构造方法中使用@AutoWird注入的类会报错null
- 用Java描述数据结构之栈和队列,以及栈和队列的常用方法
- 向前logistic回归与向后筛选出一样的变量_什么泊松分布?泊松回归又能做什么?...
- Django主从数据库分离配置
- 关于MYSQL中FLOAT和DOUBLE类型的存储
- manjaro设置字体_Manjaro安装配置美化字体模糊发虚解决记录
- UDP用户态协议栈详细实现
- php 网站克隆,如何快速克隆一个网站
- 全国计算机专业大学排名全部,全国计算机专业大学排名汇总
- 在电脑上微信无法语音聊天,微信听不到语音声音
- latex学习3:教你如何在word中像LaTex那样打公式
- grafana设置邮件监控报警
- 如何利用一维数组实现二维数组的多列自由升降序排序过程详解
- 132,怎样理解帝国和王朝的兴衰
- 利用Excel Power Query获取基金历史净值、估值和日增长率等信息
- 关于mysql的行转列问题
- Java 处理字符串中的换行
- Rocketmq同项目多个生产者多个消费者问题
- altium designer 18 调整PCB尺寸大小
热门文章
- Java核心编程总结(六、常用API与集合)
- 古剑奇谭显示服务器维修,《古剑奇谭网络版》角色转服功能说明公告
- 奥克兰计算机科学专业世界排名,2021年度QS世界大学学科排名发布!奥克兰理工大学特色专业盘点...
- python selenium ActionChains类与鼠标的模拟事件
- Canto加速市场的发展,连接全球的金融衍生品市场
- SUMO交通仿真软件从0到1使用【亲测有用】有疑问评论区可解答
- google Chrome 浏览器升级更新了来源策略,导致不同域名来源页面信息【Referer】只有域名信息
- 广东省计算机一级网络题分值,计算机一级考试分值分布
- 大学物理-热学-教学总结
- 淘宝sign 解密 淘宝商品爬虫