洗牌即产生指定数据的随机序列
第一种思路:
将54个数依次放到随机的位置。关键是每次找一个随机的位置。
下面是找这个随机位置的算法:
1、用一个Bool型数组记录各个位置是否已经放置了数,如果放置则置true,没有则为false。在算法开始时数组初始化为false。
2、每次产生一个0~53的随机数,看这个位置是否已经放置了数,如果已经放置了,则继续用同样的方法找一个随机位置判断;如果这个位置还未放置,则设置此位置,并标记其已经放置。
3、反复执行(2)直到所有的位置都放置了数为止。(只要设置成功54次数就说明所有位置已经设置了数)
例程:
void shuffle(int dest[],int n)
{
int pos,card;
memset(dest,0,sizeof(int)*n);
for(card=1;card<=n;card++)
{
do
{
pos=rand()%(n+1);
}while(dest[pos]!=0);
dest[pos]=card;
}
}
上面方法的问题:随着未设置的数渐渐变少,寻找未设置的位置会越来越难。如果牌数很多则更是不可思议。
第二种思路:
随机分配54张扑克牌到54个位置,每个位置只允许放一张牌。用1-13表示红心 A-K,14-26表示黑桃A,2,3-,Q,K,27-39表示方块A,2,3-,Q,K,40-54表示A,2,3-,Q,K,大鬼,小鬼
也就是生成1-52个不重复的随机数,放到数组中。
#include
#include
#include
const int N=54;
static int a[N];
int create(int n)
{
return (1+rand()%54);
}
int main()
{
int i,j;
srand(time(0));
for(i=1;i<=N;++i)
{
a[i]=create(N);
for(j=0;j
洗牌算法
最新推荐文章于 2025-08-07 20:58:17 发布