随机洗牌

其实我最初想到的也是那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 扑克牌洗牌算法,随机洗牌算法 | 学步园相关推荐

  1. python随机抽号_Python 创建扑克牌,并实现随机抽牌、排序、洗牌等功能

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 以下文章来源于Z先生点记,作者 zeroing 转载地址 https://mp. ...

  2. 重启随机游走算法(RWR:Random Walk with Restart)

    重启随机游走算法(RWR:Random Walk with Restart) 1 pagerank算法的基本原理 Pagerank算法是Google的网页排名算法,由拉里佩奇发明.其基本思想是民主表决 ...

  3. 随机迷宫生成算法——深度优先算法

    迷宫是我们小时候经常玩的游戏,如何用代码来快速生成上面这种迷宫呢? 迷宫算法有三大算法:深度优先算法.prim算法和递归分割算法.这里用的是深度优先算法,在此说一下算法思路,希望对各位有所帮助. 首先 ...

  4. 重启随机游走算法(RWR)

    重启随机游走算法(Random Walk with Restart) 1 pagerank算法的基本原理 Pagerank算法是Google的网页排名算法,由拉里佩奇发明.其基本思想是民主表决.在互联 ...

  5. java利用复循环洗牌算法_随机洗牌算法

    今天偶然看到群里的朋友说道,面试被问如何将扑克牌随机洗牌输出.笔者觉得这道题挺有意思而且挺开放性,有多种不同的实现方式.然后我就随手写了一个算法,仔细一想这个算法的优化空间挺大,于是又写出三种算法. ...

  6. 高纳德( Knuth)随机置乱算法,洗牌算法,等概率打乱顺序

    先看道题: 从1-100里面随机选出10个的数,你可能会先将100个数存在数组中,用到Math.random函数得到随机下标,从而选出数. 那么如果让你选出10个不同的数呢,你可能会将选出的数先存起来 ...

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

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

  8. 随机洗牌算法+matlab,洗牌算法及 random 中 shuffle 方法和 sample 方法浅析

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

  9. C#:实现随机洗牌Knuth-Durstenfeld Shuffle算法​(附完整源码)

    C#:实现随机洗牌Knuth-Durstenfeld Shuffle算法 public static void Shuffle<T>(T[] a) {Random rnd = new Ra ...

  10. 等概率随机取数算法的几种实现(洗牌算法)

    等概率随机取数算法的几种实现 最近读了项目中的工具脚本,发现一个随机取数的函数,功能大概是从M个数中不重复的随机取出N个数,算是数组随机排序然后取前N个值的变种. 脚本实现采取原始的方法,每随机取一个 ...

最新文章

  1. JMeter的安装和使用
  2. SpringBoot的构造方法中使用@AutoWird注入的类会报错null
  3. 用Java描述数据结构之栈和队列,以及栈和队列的常用方法
  4. 向前logistic回归与向后筛选出一样的变量_什么泊松分布?泊松回归又能做什么?...
  5. Django主从数据库分离配置
  6. 关于MYSQL中FLOAT和DOUBLE类型的存储
  7. manjaro设置字体_Manjaro安装配置美化字体模糊发虚解决记录
  8. UDP用户态协议栈详细实现
  9. php 网站克隆,如何快速克隆一个网站
  10. 全国计算机专业大学排名全部,全国计算机专业大学排名汇总
  11. 在电脑上微信无法语音聊天,微信听不到语音声音
  12. latex学习3:教你如何在word中像LaTex那样打公式
  13. grafana设置邮件监控报警
  14. 如何利用一维数组实现二维数组的多列自由升降序排序过程详解
  15. 132,怎样理解帝国和王朝的兴衰
  16. 利用Excel Power Query获取基金历史净值、估值和日增长率等信息
  17. 关于mysql的行转列问题
  18. Java 处理字符串中的换行
  19. Rocketmq同项目多个生产者多个消费者问题
  20. altium designer 18 调整PCB尺寸大小

热门文章

  1. Java核心编程总结(六、常用API与集合)
  2. 古剑奇谭显示服务器维修,《古剑奇谭网络版》角色转服功能说明公告
  3. 奥克兰计算机科学专业世界排名,2021年度QS世界大学学科排名发布!奥克兰理工大学特色专业盘点...
  4. python selenium ActionChains类与鼠标的模拟事件
  5. Canto加速市场的发展,连接全球的金融衍生品市场
  6. SUMO交通仿真软件从0到1使用【亲测有用】有疑问评论区可解答
  7. google Chrome 浏览器升级更新了来源策略,导致不同域名来源页面信息【Referer】只有域名信息
  8. 广东省计算机一级网络题分值,计算机一级考试分值分布
  9. 大学物理-热学-教学总结
  10. 淘宝sign 解密 淘宝商品爬虫