洗牌算法

原创 2007年10月07日 20:43:00
洗牌即产生指定数据的随机序列。
在网上找了半天大体有两种做法
1、 
思路:将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;
    }    
}
 
上面方法的问题:随着未设置的数渐渐变少,寻找未设置的位置会越来越难。如果牌数很多则更是不可思议。
 
2、下面的思路是先对数组进行初始化然后随机交换两个位置,共交换n次,其中n越大,则随机越接近随机
void shuffle ( int a[], int n )      //洗牌算法
{
    int tmp = 0,
           p1,p2;
    int cnt = rand() % 1023;
    while (cnt--)   //随机交换两个位置的数,共交换cnt次
    {
           p1 = rand() % n;
           p2 = rand() % n;
          
           tmp = a[p1];
           a[p1] = a[p2];
           a[p2] = tmp;
    }

几种随机洗牌算法的分析比较

卡牌游戏中常常需要洗牌,今天正好看到了这样的题目,搜索了些许资料,整理并且理解后,决定写出来,算法的名字无从考证,全是自己理解后给的名字,如果您有哪个算法的信息或者错误之处可以随时联系我,还请多多关照...
  • aksfhks
  • aksfhks
  • 2014年11月13日 19:05
  • 1207

用java实现三个经典的洗牌算法

三个经典的洗牌算法分别为Fisher-Yates算法,
  • georas
  • georas
  • 2014年07月09日 11:27
  • 1461

【算法】扑克牌52张,无重复洗牌算法

private static void Shuffle () { string[] cardType = { "红桃", "黑桃", "方块", "梅花" }; string[] c...
  • sinat_20559947
  • sinat_20559947
  • 2015年09月23日 09:57
  • 4215

棋牌游戏源码,扑克洗牌、发牌算法源、拱猪扑克牌C#

  • 2012年07月12日 08:53
  • 339KB
  • 下载

洗牌算法(感觉有点用)

  • 2011年11月01日 21:14
  • 896B
  • 下载

VBS洗牌算法

  • 2013年08月16日 14:57
  • 584B
  • 下载

不使用随机数的洗牌算法实现(C++实现)

偶然看到有人讨论不使用随机数怎么洗牌,感觉挺有意思的。其实本质就是要达到随机的效果,这个是开放性的问题,其实思路是很多的,主要看实现的难度或者是否可以实现随机洗牌。 我的思路有如下: ...
  • faithzzf
  • faithzzf
  • 2017年10月27日 14:26
  • 90

网易有道编程题:洗牌算法(C++)

题目:洗牌在生活中十分常见,现在需要写一个程序模拟洗牌的过程。 现在需要洗2n张牌,从上到下依次是第1张,第2张,第3张一直到第2n张。首先,我们把这2n张牌分成两堆,左手拿着第1张到第n张(上半堆)...
  • lxubin
  • lxubin
  • 2016年08月26日 21:11
  • 1788

[经典面试题]完美洗牌算法

题目有个长度为2n的数组{a1,a2,a3,…,an,b1,b2,b3,…,bn},希望排序后{a1,b1,a2,b2,….,an,bn},请考虑有无时间复杂度o(n),空间复杂度0(1)的解法。来源...
  • SunnyYoona
  • SunnyYoona
  • 2015年02月13日 16:08
  • 6973

一个简单的扑克牌洗牌算法|无重复

1.最初的想法:      第一个数:随机产生一个1-52 之间的数;  第二个数:随机产生一个,和第一个比较,如果相同,就再产生一个随机的,直到不同为止;  第三个数:随机产生一个,和第一、第...
  • wusuopuBUPT
  • wusuopuBUPT
  • 2013年04月19日 11:29
  • 3241
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:洗牌算法
举报原因:
原因补充:

(最多只允许输入30个字)