c语言洗牌算法
#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语言洗牌算法的更多相关文章
- 洗牌算法Fisher-Yates以及C语言随机数的产生
前些天在蘑菇街的面试中碰到一道洗牌的算法题,拿出来和大家分享一下! 原题是:54张有序的牌,如何无序的发给3个人? 这个题是运用经典的洗牌算法完成.首先介绍一种经典的洗牌算法--Fisher-Yate ...
- knuth洗牌算法
首先来思考一个问题: 设计一个公平的洗牌算法 1. 看问题,洗牌,显然是一个随机算法了.随机算法还不简单?随机呗.把所有牌放到一个数组中,每次取两张牌交换位置,随机 k 次即可. 如果你的答案是这样, ...
- 洗牌算法Fisher_Yates原理
1.算法 http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle 简单的原理如下图所示: 2.原理 总结下,洗牌算法Fisher_Yates ...
- C# 洗牌算法
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 C#洗牌算法如下: class Program { ...
- js 随机数 洗牌算法
function shuffle(arr){ var len = arr.length; for(var i = 0;i<len -1;i++) { var idx = Math.floor(M ...
- Fisher–Yates shuffle 洗牌算法(zz)
1,缘起 最近工作上遇到一个问题,即将一组数据,比如[A,B,C,D,E]其中的两个B,E按随机排列,其他的仍在原来的位置: 原始数组:[A,B,C,D,E] 随机字母:[B,D] 可能结果:[A,B ...
- 519. Random Flip Matrix(Fisher-Yates洗牌算法)
1. 问题 给定一个全零矩阵的行和列,实现flip函数随机把一个0变成1并返回索引,实现rest函数将所有数归零. 2. 思路 拒绝采样 (1)先计算矩阵的元素个数(行乘以列),记作n,那么[0, n ...
- 《Algorithms算法》笔记:元素排序(3)——洗牌算法
<Algorithms算法>笔记:元素排序(3)——洗牌算法 Algorithms算法笔记元素排序3洗牌算法 洗牌算法 排序洗牌 Knuth洗牌 Knuth洗牌代码 洗牌算法 洗牌的思想很 ...
- 洗牌算法shuffle
对这个问题的研究始于一次在群里看到朋友发的洗牌面试题.当时也不知道具体的解法如何,于是随口回了一句:每次从剩下的数字中随机一个.过后找相关资料了解了下,洗牌算法大致有3种,按发明时间先后顺序如下: 一 ...
随机推荐
- [z] Git pull 强制覆盖本地文件
git fetch --all git reset --hard origin/master git pull git fetch 只是下载远程的库的内容,不做任何的合并 git reset 把HEA ...
- VS2013中Nuget程序包管理器控制台使用入门(三)-项目实战(原创)
VS2013中Nuget程序包管理器控制台使用入门(三)-项目实战 1.给指定项目安装Newtonsoft.Json ,Version 4.5.11 PM> Install-Package Ne ...
- 引用类型中的push()、pop()、shift()方法
/** * write by waitingbar1014 * time 2013.10.18 * 用途:常用于如一堆游戏激活码中获得抽取的值 * **/ //有以下一个数组: var arrayli ...
- BZOJ1791或洛谷4381 [IOI2008]Island
一道基环树的直径 BZOJ原题链接 洛谷原题链接 又是一道实现贼麻烦的题.. 显然公园其实是基环树森林,求的最长距离其实就是求每一棵基环树的直径的总和. 对于每棵基环树,其直径要么经过环,要么是某个环 ...
- redis的五种存储类型的具体用法
String 类型操作 string是redis最基本的类型,而且string类型是二进制安全的.意思是redis的string可以包含任何数据.比如jpg图片或者序列化的对象 $redis-> ...
- strace使用
统计信息 -c -- count time, calls, and errors for each syscall and report summary 输出结果到文件 -o 例如 strace ...
- SpringBoot 多环境配置
转载:https://www.cnblogs.com/gdpuzxs/p/7191436.html 在我们的实际开发中,一般都有三套环境,开发环境,测试环境,生产环境,三套环境的数据库连接配置也有所不 ...
- rpm安装jdk7
原文:http://www.centoscn.com/image-text/config/2015/0208/4658.html 系统环境:centos-6.5 安装方式:rpm安装 软件:jdk-7 ...
- mysql查看某个表的列名
mysql查看某个表的列名mysql -uusername -p 输入密码按登录mysqlshow databases; 查看有哪些数据库use dbname; 选择数据库show tables:查看 ...
- LSTM长短期记忆神经网络模型简介
LSTM网络也是一种时间递归神经网络,解决RNN的长期依赖关系. RNN模型在训练时会遇到梯度消失或者爆炸的问题,训练时计算和反向传播,梯度倾向于在每一时刻递增或递减,梯度发散到无穷大或者0..... ...