做斗地主项目,洗牌算法是一个很重的一步,怎样“洗”的均匀,“洗”的随机,这是非常考究的,算法的优劣就直接会影响效果的好坏。这里我给出一个算法,将0-53这54个数字直接排序,经测试还挺随机的。这里要感谢@灰太龙的指导!这个算法是服务器端用于返回给客户端牌的算法,主要的思想就是不断的换牌,两牌交换位置,如果循环次数增大的话,随机性也会更强,洗牌的效果更好!

Code:

C#:

using System; using System.Collections.Generic; using System.Linq; using System.Text;  namespace 随机排序 {     class Program     {         static void Main(string[] args)         {             int [] data = new int [54];             for (int i = 0; i < 54; i++)             {                 data[i] = i;             }             Console.WriteLine("排序前:");             foreach (int i in data)             {                 Console.Write(i + ",");             }             long tick = DateTime.Now.Ticks;             Random random = new Random((int)(tick & 0xffffffffL) | (int)(tick >> 32));              //牌交换算法             for (int i = 0; i < 54; i++)             {                 int t1 = random.Next(0, 54);                 int t2 = random.Next(0, 54);                 int temp = data[t1];                 int data1 = data[t1];                 int data2 = data[t2];                 data[t1] = data2;                 data[t2] = temp;             }             Console.WriteLine("排序后:");             foreach (int i in data)             {                 Console.Write(i + ",");             }         }     } } 

运行截图:

C++:

void HelloWorld::xipai() {     for (int i=0; i<54; i++) {         data[i] = i;     }     //随机数     //洗牌     for(int i=0;i<54;i++)     {         int t1 = arc4random()%54;         int t2 = arc4random()%54;         int temp = data[t1];         int data1 = data[t1];         int data2 = data[t2];         data[t1] = data2;         data[t2] = temp;     }     printf("洗牌之后:\n");     for (int i =0; i<54; i++) {         printf("%d  ",data[i]);     } }

结果:

会发现还是挺随机的,如果将for循环取大一点就更随机了!

本文转蓬莱仙羽51CTO博客,原文链接:http://blog.51cto.com/dingxiaowei/1366165,如需转载请自行联系原作者

[cocos2dx]斗地主制作之洗牌算法相关推荐

  1. 面试官:会玩牌吧?给我讲讲洗牌算法和它的应用场景吧!

    有一次参加面试,面试官问我:"会玩牌吧?" 内心:"咋滴,这是要玩德州扑克(或者炸金花),赢了他就能通过面试么?" 结果-- 没想到面试官的下一句话:" ...

  2. 洗牌算法具体指的是什么

    前言: 这里是修真院前端小课堂,每篇分享文从 [背景介绍][知识剖析][常见问题][解决方案][编码实战][扩展思考][更多讨论][参考文献] 八个方面深度解析前端知识/技能,本篇分享的是: [洗牌算 ...

  3. 会排序吗_洗牌算法详解:你会排序,但你会打乱吗?

    预计阅读时间: 8 分钟 我知道大家会各种花式排序,但是如果叫你打乱一个数组,你是否能做到胸有成竹?即便你拍脑袋想出一个算法,怎么证明你的算法就是正确的呢?乱序算法不像排序算法,结果唯一可以很容易检验 ...

  4. python实现洗牌算法_洗牌算法及 random 中 shuffle 方法和 sample 方法浅析

    对于算法书买了一本又一本却没一本读完超过 10%,Leetcode 刷题从来没坚持超过 3 天的我来说,算法能力真的是渣渣.但是,今天决定写一篇跟算法有关的文章.起因是读了吴师兄的文章 <扫雷与 ...

  5. 从洗牌算法谈起--Python的random.shuffle函数实现原理

    此文首发于我的个人博客:从洗牌算法谈起–random.shuffle实现原理 - zhang0peter的个人博客 昨天看知乎的时候看到了洗牌算法(Knuth shuffle, 最初版本叫Fisher ...

  6. 随机洗牌算法 银行家算法

    1. 随机洗牌算法 https://blog.csdn.net/qq_26399665/article/details/79831490 Fisher-Yates Shuffle算法 最早提出这个洗牌 ...

  7. 洗牌算法shuffle

    对这个问题的研究始于一次在群里看到朋友发的洗牌面试题.当时也不知道具体的解法如何,于是随口回了一句:每次从剩下的数字中随机一个.过后找相关资料了解了下,洗牌算法大致有3种,按发明时间先后顺序如下: 一 ...

  8. 我以前用过的一个洗牌算法

    前两天和几个做在线棋牌游戏的朋友聚会,聊到了洗牌算法,正好以前写过一些扑克牌的游戏,中间做了一个洗牌算法,就写了个例子给他们做试验. 基本思路很简单,就是交换法,54张牌排好,随机选择两张牌交换,一般 ...

  9. Algorithm:C+语言实现之数组相关算法(和为定值的两个数、和为定值的m个数、荷兰国旗、长度为2n的洗牌算法、任意长度数组的洗牌算法)

    Algorithm:C+语言实现之数组相关算法(和为定值的两个数.和为定值的m个数.荷兰国旗.长度为2n的洗牌算法.任意长度数组的洗牌算法) 目录 数组 1.寻找和为定值的两个数 2.和为定值的m个数 ...

最新文章

  1. python3 学习使用大纲梳理
  2. winPcap_2_编译环境*注意*
  3. SAP S/4HANA表结构之变
  4. hihoCoder1678 版本号排序
  5. 服务器 .err文件,IIS 关闭HTTPERR(IIS日志)的方法
  6. leetcode 231. 2 的幂
  7. 统一沟通_边缘安装及配置之十七_(Windows Server 2008 R2 SP1英文版)
  8. 中key的用途_Python中的函数定义与参数使用
  9. js省市二级联动;)
  10. SQL Developer显示多个工作表
  11. PIX525-IPSEC-×××配置
  12. 鲸鱼优化算法_鲸鱼优化算法:一种群体智能最优化方法
  13. 农夫山泉2面面试经历
  14. 无线通信与生活-(1)
  15. Type-C扩展坞支持的手机类型
  16. 台式计算机虚拟内存怎么设置,教你怎么设置电脑的虚拟内存
  17. python urllib库获取淘宝主图
  18. 【ABAP】SE38的一些使用技巧
  19. 学友新碟private corner迷你音乐会CD/DVD超赞呀
  20. 电脑上的文件删除不掉,需要管理员权限怎么办?

热门文章

  1. android socket第三方库,OkSocket 一个Android轻量级Socket通讯框架
  2. linux执行定时,linux定时执行 - 乄珍惜
  3. php 变量存活期,php 变量生命周期:PHP源码分析-PHP的生_php
  4. python压缩文件_Python压缩及解压文件
  5. c语言谢延红主编答案,C语言程序设计课程改革与实践.doc
  6. bat窗口大小设置_如何将U盘设置成我们计算机的开机秘钥,对电脑加密。
  7. 基于python的随机森林回归实现_python实现随机森林
  8. python 3.8.5 打包_骚操作 | Python 实现在 App 端的人脸识别
  9. linux系统awk、sed,Linux系统 linux awk sed
  10. linux c 获取 多个硬盘序列号_veket系统中使用GParted进行硬盘分区