当前位置: 首页 >> 程序设计 >> 游戏开发 >> 洗牌算法
 

洗牌算法

作者:      来源:http://blog.csdn.net/adm_qxx     发表时间:2007-05-03     浏览次数:      字号:    

洗牌即产生指定数据的随机序列。
在网上找了半天大体有两种做法
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;
    }
}

责任编辑 webmaster

 
 
 
 
 
评论更多>>
 
 
 
发表
 
姓名: QQ:
性别: MSN:
E-mail: 主页:
评分: 1 2 3 4 5
评论内容:
验证码:
  
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。
  •