洗牌算法

原创 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;
    }
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

VBS洗牌算法

  • 2013-08-16 14:57
  • 584B
  • 下载

完美洗牌算法学习

完美洗牌问题,给定一个数组a1,a2,a3,...an,b1,b2,b3..bn,把它最终设置为b1,a1,b2,a2,...bn,an这样的。 分析:      首先,有的问题要求把它换...

A Simple In-Place Algorithm for In-Shuffle 一种简单的原地洗牌算法

只是把这篇文章前3部分翻译了,由于是学通信的,很多计算机术语可能翻译的不对,对文章内容理解偏差也可能会导致翻译错误,若发现,请指正,方便我更正!  1引文 通过把一副牌均分为两半,让后一半交错插...

随机洗牌算法

算法一:就是随机一个位置放入队列中的一个书,位置上已经有数则重新随机一个位置,直到队列空 算法(Java): public HashSet getRamdomNumber(int total,i...

洗牌算法

1.常见的洗牌算法  void shuffle_normal(int* array, const int length) { if (NULL == array || 0 >= length...

Collections 洗牌算法源码

如何打乱List 或 Array元素的顺序 打乱List或者Array数据元素的顺序,其实就是让集合中的元素变得随机,举个例子,有如下一个Array数据:  其中存储了 1, 2, 3, 4,...

洗牌算法 数组打乱顺序 Fisher-Yates shuffle

http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle 大公司面试题见过几次 今天实现以下 其实MODERN算法很简单 1. 实...

洗牌算法

原文地址:http://blog.csdn.net/feixiaoxing/article/details/6860339/ 扑克牌洗牌是我们生活中比较喜欢玩的一个游戏。那么我们有没有什么办...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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