洗牌实际上就是乱数问题,也可以理解为是一种随机数的问题。这其中的思路可以用做一种生成随机数的方法。
思路为:用一个数组记录下1----52的数据,然后遍历这个数组,在遍历的过程中,将当前数组的值与产生的随机下标对应的数组中的值进行交换,便利完成,这个数组就成了一个随机数的序列了.
//
//
// 洗扑克牌
//
// 乱序问题
//
///
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void Swap( int * number1 , int * number2 )
{
int tmp ;
tmp = *number1 ;
*number1 = *number2 ;
*number2 = tmp ;
}
void shuffle_poker( int * poker)
{
int random ; // 随机数
for( int i = 1 ; i <= 52 ; i++ ) // 注意:下标是从1开始的
{
poker[i] = i ;
}
srand( time( NULL ) ) ;
for( i = 1 ; i <= 52 ; i++ )
{
random = rand() % 52 + 1 ; // 产生1---52之间的随机数
Swap( &poker[i] , &poker[random] ) ; // 交换位置
}
}
int main()
{
int poker[53] ; // 存储1---52张牌
shuffle_poker( poker ) ; // 开始洗牌
for( int i = 1 ; i <= 52 ; i++ ) // 将洗牌后的结果输出
{
switch( poker[i] / 13 )
{
case 0:
printf("黑桃:%d\n",poker[i] % 13 + 1 ) ; break ;
case 1:
printf("红心:%d\n",poker[i] % 13 + 1 ) ; break ;
case 2:
printf("梅花:%d\n",poker[i] % 13 + 1 ) ; break ;
case 3:
printf("方块:%d\n",poker[i] % 13 + 1 ) ; break ;
}
}
return 0 ;
}