扑克牌一共有54张,洗牌是将扑克牌顺序打散。那么问题很简单,设计一个算法,实现洗牌的功能,利用自带的RAND函数
全局洗牌
- 初始化一个数组,大小为54,初始化值为1~54
- 按照索引1到54,逐步对每一张索引牌进行洗牌
首先生成一个随机数 value = rand %54,再将索引值和该随机数的内容交换 - 等到索引到54最后一个结束后,一副牌就洗好了
void get_rand_number(int array[], int length) { int index; int value; int median; if(NULL == array || 0 == length) return ; /* 每次发牌的时候任意分配待交换的数据 */ for(index = 0; index < length; index ++){ value = rand() % length; median = array[index]; array[index] = array[value]; array[value] = median; } }
局部洗牌
全局洗牌的问题是,由于是遍历1-54,部分牌会出现重复交换,可能会产生问题。那么更好的解决办法就是,当前牌和之后的牌中随机交换。
- 初始化一个数组,大小为54,初始化值为1~54
- 索引牌从1开始,到54结束。这一次索引牌只和剩下还没有洗的牌进行交换, value = index + rand() %(54 – index)
- 等到所有的索引牌都洗好之后,一副牌就弄好了
void get_rand_number(int array[], int length) { int index; int value; int median; if(NULL == array || 0 == length) return ; /* 发牌的时候对于已经分配的数据不再修改 */ for(index = 0; index < length; index ++){ value = index + rand() % (length - index); median = array[index]; array[index] = array[value]; array[value] = median; } }
http://www.bcoder.cn 来访了! 可以交换有链吗
[/钱]领教了