主题:扑克牌洗牌(大家都来交流吧)
大家好:
我是一个刚学习C++不久的学生,在学习过程中碰到了一个有趣的问题,就是扑克牌的洗牌问题。这是课上的一个洗牌函数(DeckOfCards,shuffle,deal):
void shuffle()
{
int row;//represents suit value of card
int coloum;//represents face value of card
//for each of the 52 cards, choose a slot of the deck randomly
for( int card = 1; card <= 52; card++ )
{
do// choose a new random location until unoccupied slot is found
{
row = rand() % 4;//randomly select the row
coloum = rand() % 13; //randomly select the coloum
}while( deck[row][coloum] != 0 );//end do while//随机洗牌
//place card number in chosen slot of deck
deck[row][coloum] = card;//洗出的牌用数组deck储存
}//end for
}//end function shuffle
以上是洗牌函数 shuffle :在数组deck[row][coloum]中填充数字 1 ,表示这张牌是洗完牌后将要发的第一张牌,这个过程一直持续下去,把数字2,3,...52随机填充倒数组deck中。但是,当数组deck开始用牌号进行填充时,一张牌可能被第二次选中( 即当deck[row][coloum]被选中时其值非0 )。如果洗过的牌被重复地随机选择,那么这种洗牌算法可能要执行无限长的时间。这就是所谓的无限延迟,也称饿死(starvation)
为了排除无限延迟的可能性,我向各位征求一些更高效的洗牌算法。
如果能分析出算法的优点与缺点,也欢迎赐教。
我是一个刚学习C++不久的学生,在学习过程中碰到了一个有趣的问题,就是扑克牌的洗牌问题。这是课上的一个洗牌函数(DeckOfCards,shuffle,deal):
void shuffle()
{
int row;//represents suit value of card
int coloum;//represents face value of card
//for each of the 52 cards, choose a slot of the deck randomly
for( int card = 1; card <= 52; card++ )
{
do// choose a new random location until unoccupied slot is found
{
row = rand() % 4;//randomly select the row
coloum = rand() % 13; //randomly select the coloum
}while( deck[row][coloum] != 0 );//end do while//随机洗牌
//place card number in chosen slot of deck
deck[row][coloum] = card;//洗出的牌用数组deck储存
}//end for
}//end function shuffle
以上是洗牌函数 shuffle :在数组deck[row][coloum]中填充数字 1 ,表示这张牌是洗完牌后将要发的第一张牌,这个过程一直持续下去,把数字2,3,...52随机填充倒数组deck中。但是,当数组deck开始用牌号进行填充时,一张牌可能被第二次选中( 即当deck[row][coloum]被选中时其值非0 )。如果洗过的牌被重复地随机选择,那么这种洗牌算法可能要执行无限长的时间。这就是所谓的无限延迟,也称饿死(starvation)
为了排除无限延迟的可能性,我向各位征求一些更高效的洗牌算法。
如果能分析出算法的优点与缺点,也欢迎赐教。