假定N=54,首先,我们有一个随机函数发生器,能够产生1-54之间的随机数,如何保证抽第一张牌是54中可能,抽第二张牌是53中可能,……
可以这样做,假设扑克牌是一个54维的数组card, 我们要做的就是从这个数组中随机取一个元素,然后在剩下的元素里再随机取一个元素… 这里涉及到一个问题,就是每次取完元素后,我们就不会让这个元素参与下一次的选取。
int index=i+rand()%(n-i);//保证前面已经确定的元素不会参加下面的选取
我们要实现的目的是以等概率的方式将这54个数随机打乱排列,因此,可以这样处理:
第一次抽牌在初始54张牌中,将 随机产生的牌x,与第一个元素互换,
第二次抽牌在剩下的53张牌中,将 随机产生的牌y,与第二个元素互换,
void shuffle(int cards[],int n)
{
if(cards==NULL)
return ;
srand(time(0));
for(int i=0;i<n-1;++i)
{
//保证每次第i位的值不会涉及到第i位以前
int index=i+rand()%(n-i);//保证前面已经确定的元素不会参加下面的选取
int temp=cards[i];
cards[i]=cards[index];
cards[index]=temp;
}
}
//随机产生序列号,类似选择排序(通过index=i + rand()%(n-i)保证前面选好的元素下标不会再次被使用),完成元素交换