当前位置:编程学习 > C/C++ >>

给出洗牌的一个算法,并将洗好的牌存储在一个整形数组里。

给出洗牌的一个算法,并将洗好的牌存储在一个整形数组里。 (思路1)

 


本题的解决办法是:将1到54张牌,依次随机的存储到一个54大小的数组中。采用这种办法时间和空间复杂度都比较大。

 


本题通过<stdlib.h>中的rand生成随机数方法实现,在调试过程中,发现每次运行后的随机数都是一样的,解决办法如下:

首先给出两个函数

函数一:int rand(void);
从srand (seed)中指定的seed开始,返回一个【seed, RAND_MAX(0x7fff)】间的随机整数。
函数二:void srand(unsigned seed);
参数seed是rand()的种子,用来初始化rand()的起始值。


因此咱们可以这样认为:rand()在每次被调用的时候,它会查看:
1) 如果用户在此之前调用过srand(seed),给seed指定了一个值,那么它会自动调用srand(seed)一次来初始化它的起始值。
2) 如果用户在此之前没有调用过srand(seed),它会自动调用srand(1)一次。


根据上面的第一点我们可以得出:
1) 如果希望rand()在每次程序运行时产生的值都不一样,必须给srand(seed)中的seed一个变值,这个变值必须在每次程序运行时都不一样(比如到目前为止流逝的时间)。
2) 否则,如果给seed指定的是一个定值,那么每次程序运行时rand()产生的值都会一样,虽然这个值会是【seed, RAND_MAX(0x7fff)】之间的一个随机取得的值。
3) 如果在调用rand()之前没有调用过srand(seed),效果将和调用了srand(1)再调用rand()一样(1也是一个定值)。

 

 

在代码中,加入srand(time(0));即可解决此问题。


[cpp]
srand(time(0));     //生成的随机数每次都保证不一样  
    for(i=0;i<CARDS_NUM;i++) 
    { 
        randPosition=rand()%54; 
        insertCard(randCards,randPosition,cards[i]); 
    } 

srand(time(0));  //生成的随机数每次都保证不一样
 for(i=0;i<CARDS_NUM;i++)
 {
  randPosition=rand()%54;
  insertCard(randCards,randPosition,cards[i]);
 }

关于time_t time(0):

time_t被定义为长整型,它返回从1970年1月1日零时零分零秒到目前为止所经过的时间,单位为秒。

 

[cpp]
//给出洗牌的一个算法,并将洗好的牌存储在一个整形数组里。   
 
//一副牌有54张牌,1——13表示黑桃;14——26表示红桃;  
                //27——39表示梅花;40——52表示方块;51小王;52大王。  
 
 
#include <stdio.h>  
#include <stdlib.h>  
#include <time.h>  
 
#define CARDS_NUM 54   
 
//创建一副牌(创建一个整型数组1到54)  
int * createCards(int *cards) 

    int i=0; 
    for(i=0;i<CARDS_NUM;i++) 
    { 
        *cards=i+1; 
        cards++; 
    } 
    return cards; 

 
//打印数组中的元素  
void printCards(int *cards) 

    int flag=0; 
    int i=0; 
    for(i=0;i<CARDS_NUM;i++) 
    { 
        if(flag==13) 
        { 
            printf("\n"); 
            flag=1; 
        } 
        else 
        { 
            flag++; 
        } 
        printf("%3d ",*cards); 
        cards++; 
    } 
    printf("\n"); 

 
//从当前位置向后找到一个数组中的空位(循环扫描)  
int findFreePosition(int * cards,int currentPosition) 

    int p=currentPosition; 
    while(*(cards+p)!=0) 
    { 
        p=(p+1)%CARDS_NUM; 
    } 
    return p; 

 
//在数组中的某个问题插入某张牌  
int * insertCard(int *cards,int currentPosition,int card) 

    int p=0; 
    p=findFreePosition(cards,currentPosition); 
    *(cards+p)=card; 
    return cards; 

 
void main() 

    int i=0; 
    int randPosition=0; 
    int cards[CARDS_NUM]={0};       //有序牌  
    int randCards[CARDS_NUM]={0};       //无序牌  
 
    printf("一副牌有54张牌:1——13表示黑桃;14——26表示红桃;\n"); 
    printf("           27——39表示梅花;40——52表示方块;\n"); 
    printf("           51表示小王;52表示大王。\n\n"); 
 
    createCards(cards); 
    printf("原始有序牌为:\n"); 
    printCards(cards); 
 
    srand(time(0));     //生成的随机数每次都保证不一样  
    for(i=0;i<CARDS_NUM;i++) 
    { 
        randPosition=rand()%54; 
        insertCard(randCards,randPosition,cards[i]); 
    } 
    printf("\n随机洗牌后的结果是:\n"); 
    printCards(randCards); 

//给出洗牌的一个算法,并将洗好的牌存储在一个整形数组里。

//一副牌有54张牌,1——13表示黑桃;14——26表示红桃;
    //27——39表示梅花;40——52表示方块;51小王;52大王。


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define CARDS_NUM 54

//创建一副牌(创建一个整型数组1到54)
int * createCards(int *cards)
{
 int i=0;
 for(i=0;i<CARDS_NUM;i++)
 {
  *cards=i+1;
  cards++;
 }
 return cards;
}

//打印数组中的元素
void printCards(int *cards)
{
 int flag=0;
 int i=0;
 for(i=0;i<CARDS_NUM;i++)
 {
  if(flag==13)
  {
   printf("\n");
   flag=1;
  }
  else
  {
   flag++;
  }
  printf("%3d ",*cards);
  cards++;
 }
 pri

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,