自己想的,希望砖家斧正算法模拟现实中洗牌
单副牌(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