程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 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++;
 }
 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);
}

 

第一次洗牌:

 

 \
 

 

第二次洗牌:

 


 

\

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved