From Gossip@caterpillar

Algorithm Gossip: 洗扑克牌(乱数排列)

说明

洗扑克牌的原理其实与乱数排列是相同的,都是将一组数字(例如1~N)打乱重新排列,只不过洗扑克牌多了一个花色判断的动作而已。

解法

初学者通常会直接想到,随机产生1~N的乱数并将之存入阵列中,后来产生的乱数存入阵列前必须先检查阵列中是否已有重复的数字,如果有这个数就不存入,再重新产生下一个数,运气不好的话,重复的次数就会很多,程式的执行速度就很慢了,这不是一个好方法。

以1~52的乱数排列为例好了,可以将阵列先依序由1到52填入,然后使用一个回圈走访阵列,并随机产生1~52的乱数,将产生的乱数当作索引取出阵列值,并与目前阵列走访到的值相交换,如此就不用担心乱数重复的问题了,阵列走访完毕后,所有的数字也就重新排列了。

至于如何判断花色?这只是除法的问题而已,取商数判断花色,取余数判断数字,您可以直接看程式比较清楚。

实作

  • C
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 52int main(void) {int poker[N + 1];int i, j, tmp, remain;// 初始化阵列 for(i = 1; i <= N; i++)poker[i] = i; srand(time(0));// 洗牌 for(i = 1; i <= N; i++) {j = rand() % 52 + 1;tmp = poker[i];poker[i] = poker[j]; poker[j] = tmp; }for(i = 1; i <= N; i++) {// 判断花色 switch((poker[i]-1) / 13) { //每13一循环,但13的倍数仍是该循环对应的花色,所以poker[i]要-1case 0: printf("桃"); break;case 1: printf("心"); break;case 2: printf("砖"); break;case 3: printf("梅"); break;} // 扑克牌数字 remain = poker[i] % 13;switch(remain) { case 0: printf("K "); break;case 12: printf("Q "); break;case 11: printf("J "); break;default: printf("%d ", remain); break;} if(i % 13 == 0)printf("\n");} return 0;
}
  • Java
public class ShuffleCard { public static void main(String args[]) { final int N = 52; int[] poker = new int[N + 1]; // 初始化阵列 for(int i = 1; i <= N; i++) poker[i] = i; // 洗牌 for(int i = 1; i <= N; i++) { int j = (int) (Math.random() * N);if(j == 0)j = 1;int tmp = poker[i]; poker[i] = poker[j]; poker[j] = tmp; } for(int i = 1; i <= N; i++) { // 判断花色 switch((poker[i]-1) / 13) { //每13一循环,但13的倍数仍是该循环对应的花色,所以poker[i]要-1case 0: System.out.print("桃"); break; case 1: System.out.print("心"); break; case 2: System.out.print("砖"); break; case 3: System.out.print("梅"); break; } // 扑克牌数字 int remain = poker[i] % 13; switch(remain) { case 0: System.out.print("K "); break; case 12: System.out.print("Q "); break; case 11: System.out.print("J "); break; default: System.out.print(remain + " "); break; } if(i % 13 == 0) System.out.println(""); } }
}

算法 洗扑克牌(乱数排列)相关推荐

  1. 洗扑克牌 (乱数排序)

    解法: 初学者通常会直接想到,随机产生1~N的乱数并将之存入阵列中,后来产生的乱数存入阵列前必须先检查阵列中是否已有重复的数字,如果有这个数字就不存入,在重新产生下一个数.运气不好的话,重复的次数就会 ...

  2. C++经典算法题-洗扑克牌(乱数排列)

    24.Algorithm Gossip: 洗扑克牌(乱数排列) 说明 洗扑克牌的原理其实与乱数排列是相同的,都是将一组数字(例如1-N)打乱重新排列,只不过洗扑克牌多了一个花色判断的动作而已. 解法 ...

  3. 洗扑克牌(乱数排列)(c/python略)

    洗扑克牌的原理其实与乱数排列是相同的,都是将一组数字(例如1-N)打乱重新排列,只不过洗扑克牌多了一个花色判断的动作而已. 原理:以1-52的乱数排列为例好了,可以将阵列先依序由1到52填入,然后使用 ...

  4. 扑克洗牌(乱数排列)

    /** * 洗扑克牌(乱数排列) * @author huangbiao86 */ public class Card { public static void main(String[] args) ...

  5. flash中乱数排列(随机数)方法

    介绍两种乱数排列的方法: 在1到32中选取10个随机数,要求这10个随机数必须是不重复的. 方法1:在1到32中选取1个随机数后,把它与前面选取的所有数进行比较,如果和其中一个相同,那么就重新选择:如 ...

  6. C语言实现-“洗 扑克牌”程序 算法(详解)

    1.问题引入 我们对"扑克牌"这个词并不陌生,作为一种娱乐活动被大众所熟知.那么,每一局结束后,除了人工洗牌,我们接触到的软件.小程序中如何实现的"洗牌"呢?其 ...

  7. 洗牌程序c语言原理,C语言经典算法 - 洗牌算法

    下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. 说明: 洗扑克牌的原理其实与乱数排列是相同的,都是将一组数字(例如1-N)打乱重新排列,只 ...

  8. 【COGS】2287:[HZOI 2015]疯狂的机器人 FFT+卡特兰数+排列组合

    [题意][COGS 2287][HZOI 2015]疯狂的机器人 [算法]FFT+卡特兰数+排列组合 [题解]先考虑一维的情况,支持+1和-1,前缀和不能为负数,就是卡特兰数的形式. 设C(n)表示第 ...

  9. 【游戏中的算法】洗扑克牌算法

    文章目录 一.洗扑克牌算法 二.C/C++实现方法: 三.JavaScript实现效果图: 1.初始页面 和 clear 后: 2.初始化扑克牌: 3.洗扑克牌后: 四.JS代码和54张扑克牌下载地址 ...

最新文章

  1. mysql 与 oracle 的连表update
  2. 【剑指offer】面试题 5. 替换空格
  3. STM32F103+UCOS-II 实现临界区不关闭重要中断
  4. cygwin不能执行make
  5. MyBatis之注解开发
  6. 让每次编译产生的目标文件都能打印出编译时间信息
  7. C语言进行数据指定步长的区间统计
  8. 对动画教程的坐标反转公式求证
  9. ACM学习历程—HihoCoder1309任务分配(排序 贪心)
  10. Linux常用的服务器构建
  11. ubuntu1804系统设置在哪里_电销呼叫系统CRM功能设计
  12. linux redis客户端_10个 Linux 顶级开源缓存工具
  13. Linux命令使用练习二
  14. mysql client 升级_升级MySQL (参考MySQL官方文档)
  15. DHCP服务的八种报文(消息)作用
  16. matplotlib色彩(colors)之色彩基础知识(色彩模型,matplotlib色彩格式,matplotlib默认色彩映射)
  17. sublime复制一行_sublime怎么快速复制一行,快捷键是什么?
  18. 多元逻辑回归(Multinomial Logistic Regression)
  19. postman面试_接口测试面试常见问题
  20. WineBottler for Mac (Mac运行exe程序) 使用教程

热门文章

  1. 计算机开机屏幕英语,电脑开机进不了系统,屏幕一堆英文数字怎么办?别急有方法...
  2. mybatis(二)xml配置文件详细说明
  3. 零基础 学 python开发 (Genius套餐A) 四十一
  4. 商业银行数据资产管理体系建设实践报告
  5. Mogrt是什么?如何在PR中安装.Mogrt文件并使用 Premiere基本图形MOGRT文件
  6. background-position百分比格子速记法
  7. 如有问题,请及时联系 || 如有不足,请批评指出,一定会虚心改正 || 如有好的意见 ,欢迎下面留言
  8. 在 Lenovo G360 笔记本上安装 Debian Squeeze AMD64
  9. 2023.0125.1-edge浏览器与百分浏览器
  10. 水箱建模最小二乘法_【案例揭秘】利用隐变量建模和近红外光谱技术降低高剪切湿法制粒工艺放大的风险...