給出洗牌的一個算法,並將洗好的牌存儲在一個整形數組裡。 (思路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);
}
第一次洗牌:
第二次洗牌: