复杂洗牌算法
一副牌(n张),有没有针对它的复杂洗牌算法?如果请给出源代码,谢谢了
一副牌(n张),有没有针对它的复杂洗牌算法?如果请给出源代码,谢谢了
Hash
已知 N 张牌,放置于数组 A[N] ,对于任意一种牌序:
1。初始化随机数发生器,令 idx = N - 1 ;
2。从 idx 前面的 idx 张牌(0 ~ idx - 1)中,随机选一张,与 A[idx] 交换;
3。idx 减 1;
4。若 idx 大于 0(前面还有牌),跳到步骤2;
5。完成洗牌。
srand(time(0));
for(int i=52;i>0;--i)
{
int index=rand()%i;
a[i-1]^=a[index]^=a[i-1]^=a[index];
}
shuffle再shuffle,几遍之后很随机了。偷懒的话直接用stl提供的random_shuffle好了。
mark
直接用随机函数多随机几遍,就好了~~
原来还有些迷糊,看完大家的也就明白了,54个数,多随机几次就OK
一楼的是《c++大学教程》里的copy版
Leaveye说的是其优化算法
菜鸟请问能不能再加个排序,就是对每个人的牌要按桥牌的规则输出。即一个人的牌要先按牌的花色(顺序为梅花、方块、红心和黑桃)进行分类,同一类的牌要再按A、K、Q、J、…、3、2牌的大小顺序排列。另发牌应按四个人的顺序依次分发。谢谢各位了。
include <stdio.h>
main()
{
int a[52];
int temp;
int i,j;
clrscr();
for (i=0;i<52;i++)
a[i]=i+1;
srand(time(NULL));
for (i=0;i<=9;i++)
{
j=rand()%10;
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
for (i=0;i<=9;i++)
printf("%d\n",a[i]);
}