zoukankan      html  css  js  c++  java
  • 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(" ");
    }
    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的随即数字的问题。

    
    
  • 相关阅读:
    Spring IOC 和 AOP
    Java 类加载机制
    面向对象程序设计思想简述
    Linux 卸载 MySQL 数据库
    Linux 安装 mysql 数据库
    Linux 配置 JDK
    Linux 指令
    去除字符串里面的某些字符替换成另一个字符
    jsp有哪些内置对象?作用分别是什么? 分别有什么方法?
    jsp有哪些动作?作用分别是什么?
  • 原文地址:https://www.cnblogs.com/ma77045728/p/6921216.html
Copyright © 2011-2022 走看看