#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
void shuffle(char poker[54][7])
{
char temp[6]="";
for (int i = 0; i < 54; i++)
{
int j = rand() % 54;
strcpy(temp, poker[i]);
strcpy(poker[i], poker[j]);
strcpy(poker[j], temp);
}
}
int main(void)
{
srand(time(NULL));
char poker[54][7];
/*初始化*/
for (int i = 0; i < 52; i++)
{
if((i+1)%4==0) strcpy(poker[i], "方");
else if ((i + 1) % 4 == 1)strcpy(poker[i], "草");
else if ((i + 1) % 4 == 2)strcpy(poker[i], "红");
else strcpy(poker[i], "黑");
}
for (int i = 0; i < 52; i++)
{
int j = (i + 1)/ 4;
switch (j)
{
case 0:strcat(poker[i], "A"); break;
case 10:strcat(poker[i], "J"); break;
case 11:strcat(poker[i], "Q"); break;
case 12:strcat(poker[i], "K"); break;
default:char temp[3]="";
_itoa(j+1,temp,10);
strcat(poker[i], temp); break;
}
}
strcpy(poker[52],"小王");
strcpy(poker[53], "大王");
shuffle(poker);
for (int i = 0; i < 54; i++)
{
printf("%s ", poker[i]);
/*方便显示*/
if ((i + 1) % 13 == 0)printf("\n");
}
return 0;
}

头文件:#include <time.h>
定义函数:time_t time(time_t *t);
函数说明:此函数会返回从公元 1970 年1 月1 日的UTC 时间从0 时0 分0 秒算起到现在所经过的秒数。如果t 并非空指针的话,此函数也会将返回值存到t 指针所指的内存。
返回值:成功则返回秒数,失败则返回-1。

所以上程序中time(Null)起到产生一个永远不重复的数字的作用。

srand()和rand(),srand()就是给rand()提供种子,这两个函数在#include<stdlib.h>中

void srand(
unsigned int seed
);
int rand( void );

其中seed的值不同rand()就会返回不同的随机数。

所以rand()作用就是每次都产生不同的随机数。另外一定要注意,每执行一次rand()函数,程序都会同时重新执行一次srand(seed),如果seed有变化,rand()就会生成

一个和上次执行不一样的随机数。因为上面程序定义了srand(time(NULL)),所以每次调用执行rand()都会产生一个新的随机数。

char *_itoa(
int value,
char *str,
int radix
); //value是要转化的int值,str是转化完要存放的位置的起始地址,radix表示转化时的进制如2,8,10,16等

程序思路:

用字符串数组表示54张牌,0-3元素为A,依次类推,52和53号元素表示大小王。洗牌的问题转化为将数组中每个元素都与另一个随机元素交换值的问题。继而转化为每次交换产生一个0~53的随即数字的问题。

												

c语言洗牌算法的更多相关文章

  1. 洗牌算法Fisher-Yates以及C语言随机数的产生

    前些天在蘑菇街的面试中碰到一道洗牌的算法题,拿出来和大家分享一下! 原题是:54张有序的牌,如何无序的发给3个人? 这个题是运用经典的洗牌算法完成.首先介绍一种经典的洗牌算法--Fisher-Yate ...

  2. knuth洗牌算法

    首先来思考一个问题: 设计一个公平的洗牌算法 1. 看问题,洗牌,显然是一个随机算法了.随机算法还不简单?随机呗.把所有牌放到一个数组中,每次取两张牌交换位置,随机 k 次即可. 如果你的答案是这样, ...

  3. 洗牌算法Fisher_Yates原理

    1.算法 http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle 简单的原理如下图所示: 2.原理 总结下,洗牌算法Fisher_Yates ...

  4. C# 洗牌算法

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精   C#洗牌算法如下: class Program { ...

  5. js 随机数 洗牌算法

    function shuffle(arr){ var len = arr.length; for(var i = 0;i<len -1;i++) { var idx = Math.floor(M ...

  6. Fisher–Yates shuffle 洗牌算法(zz)

    1,缘起 最近工作上遇到一个问题,即将一组数据,比如[A,B,C,D,E]其中的两个B,E按随机排列,其他的仍在原来的位置: 原始数组:[A,B,C,D,E] 随机字母:[B,D] 可能结果:[A,B ...

  7. 519. Random Flip Matrix(Fisher-Yates洗牌算法)

    1. 问题 给定一个全零矩阵的行和列,实现flip函数随机把一个0变成1并返回索引,实现rest函数将所有数归零. 2. 思路 拒绝采样 (1)先计算矩阵的元素个数(行乘以列),记作n,那么[0, n ...

  8. 《Algorithms算法》笔记:元素排序(3)——洗牌算法

    <Algorithms算法>笔记:元素排序(3)——洗牌算法 Algorithms算法笔记元素排序3洗牌算法 洗牌算法 排序洗牌 Knuth洗牌 Knuth洗牌代码 洗牌算法 洗牌的思想很 ...

  9. 洗牌算法shuffle

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

随机推荐

  1. (转)easyui datagrid 部分参数说明

    easyui datagrid 部分参数 数据表格属性(DataGrid Properties) 属性继承控制面板,以下是数据表格独有的属性. 名称 类型 描述 默认值 columns array 数 ...

  2. Minimum number of steps 805D

    http://codeforces.com/contest/805/problem/D D. Minimum number of steps time limit per test 1 second ...

  3. 简单使用DESeq做差异分析

    简单使用DESeq做差异分析 Posted: 五月 06, 2017  Under: Transcriptomics  By Kai  no Comments DESeq这个R包主要针对count d ...

  4. Java中关键字static的使用

    static 关键字 1).static只能修饰成员变量或成员方法,所有非静态是对象相关的,所有静态是类相关的. 2)被static修饰的成员变量成员方法独立于该类的任何对象,它不依赖类的特定的实例, ...

  5. 检查mysql是否运行

    netstat -tunple|grep mysql

  6. Eclipse快速生成覆盖方法、Getter、Setter的方法

    点击鼠标右键 --> Source --> 直接使用快捷键 Alt+Shift+s

  7. 类名.class 与 类名.this 详解

    类名.class 与 类名.this 详解 今天在看 PropertyPlaceholderConfigurer 源码时,突然看到一个 PropertyPlaceholderConfigurer.th ...

  8. base64编码是什么1

    首先明确一点base64 是一种编码格式.就想UNICODE一样,能在电脑上表示所有字符,或者换句话说通过编码能让电脑理解你想要表示的字符(因为电脑只知道0和1 ) 就像ascII 中 0100 00 ...

  9. SQL 获得两个时间段之间的数据

    一般保存在数据库中的日期精度很高,比如'2014-04-15 16:31:22.000' 而一般用户选择的时间精度是精确到日的,比如'2012-04-15' 所以你想取出两个日期之间的数据,如果用下面 ...

  10. 《MinDoc 接口文档在线管理系统》

    项目简介 MinDoc 是一款针对IT团队开发的简单好用的文档管理系统. MinDoc 的前身是 SmartWiki 文档系统.SmartWiki 是基于 PHP 框架 laravel 开发的一款文档 ...