给定N张扑克牌和一个随机函数,设计一个洗牌算法

假定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)保证前面选好的元素下标不会再次被使用),完成元素交换

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值