由洗牌想到的不重复随机数的生成

自己想的,希望砖家斧正算法模拟现实中洗牌

单副牌(54张),放在牌座上,给一副牌每张牌标定一个层,一副牌最低端的是第0层,最上面的是第53层,那么所有牌的所在的层就固定了。

例如:红桃A,在洗牌之前,在扑克牌的第5层(这里相对的扑克牌的第0层是最低下的一张牌,当然也可是最上面的一张牌,这是一个参照问题),洗完后可能就是在第53层。再洗一次可能就是在第6层。

总而言之洗牌其实就是随即每张牌的所在层数,每张牌所得的所在层数,下面我们称之为牌的层属性,

第一种情况,所有牌的层属性都不行同,0-53;

第二种情况是,所有牌的层属性允许相同,先随即得到层属性的牌优先在最上面,层属性越大的优先在最上面。

 

 

 

第一种情况就不用说了

我主要是说的第二种情况,例如,在某次随即过程中,红桃A的层属性的值是2, 红桃K的也是2,红桃9的也是2,梅花3的也是2,小王的也是2。

那么牌所在层数由高到低相对就是

2,2,2,2,2,2

红桃A,红桃K,红桃9,梅花3,小王

 

当然在现实洗牌中,每张牌的层数随着洗牌次数的增加,扑克牌的层属性就有所改变,也就是说洗牌过程中变化的是每张扑克层属性

 

class Card

{

   int layer;//层属性

   int dot;//牌的点数

}

 

 

 

 

 

 

 

这里的变化就是单张扑克牌的所在层,也就是扑克牌的层属性的变化;

初始化54张牌

Card[] crd = new Card[54];

Random rnd= new Random();

for(int i=0;i<crd.Length;i++)

{

  crd[i].dot =i;

 

  crd[i].layer =rnd.Next(1,55);

}

 

//对层数进行排序。这里的排序也很关键,我用的是改进的冒泡法排序的

SortByLayer(ref crd);

 

void SortByLayer(ref Card[] crds)

{

    Card tmpCrd;

    int nl = crds.length-1,kl;

    for(int i=0;i<crds.Length-1;i++)

   {

     for(int j=0;j<nl;j++)

    {

         if(crds[j].layer>crds[j+1].layer)

        {

            tmpCrd = crds[j];

            crds[j]=crds[j+1];

            crds[j+1] = tmpCrd;

           kl=j;

        }

         

    }

  

   nl=kj;

  if(nl==0)break;

}

 }

 

 

用这个算法也可以模拟随机数的生成,产生1-100的不重复的随机数,就可以用上面的思想,over

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值