关于随机序列的算法

前几天做了个斗地主纸牌程序,根据常理要求三位玩家手中的牌为总数54张牌中的三个随机子序列,设定54张牌与0到53这些键值一一对应,那么要解决的就是产生三个0到53之间的不重复随机序列,之前我采用如下方法:

1.先产生一个稍大的随机序列,

2.从该主序列中顺次取值构成子序列,

3.若当前值已在子序列中,则舍弃当前值,返回2直到完成54个键值的获取,

代码如下:

 
void makeCards( vector<int> &player1 )
{
//define the three vectors
vector<int> key(600,0);
vector<int> flag(54,0);

/* initialize random seed: */
srand( time(NULL) );

/* generate the key sequence: */
for (int p=0;p<600;p++) {
key[p]=rand()%54;
}

// make cards for the three players
int i=0,i1=0,i2=0,j=0;

  //define the three vectors
vector<int> key(600,0);
vector<int> flag(54,0);

/* initialize random seed: */
srand( time(NULL) );

/* generate the key sequence: */
for (int p=0;p<600;p++) {
key[p]=rand()%54;
}

// make cards for the three players
int i=0,i1=0,i2=0,j=0;

// make vector1
while (i<MAXFORONE) {
if (i==0) {
player1.push_back(key[j]);
flag[key[j]]=1;
i++;
j++;
}
else {
if (flag[key[j]]==0) {
player1.push_back(key[j]);
flag[key[j]]=1;
i++;
j++;
}
else {
j++;
}
}
}
     
}

今天在一本数值分析书上发现一个更好的思路,产生一个0~n的m个数的不重复序列用递归思想描述为: 

1.当前规模为n,产生m个数的不重复随机序列等价于产生0~n-1的m-1个数的不重复随机序列,并设T为0~n的

一个随机数,如果 T与前m-1个数重复则舍去T,否则将T添加进m-1序列组成m序列

2.对于产生0~n-1之间的m-1个数的序列,返回1,令n'=n-1,m'=m-1重复执行直到m’=1,此时的取值范围n‘=n-m+1, 

问题简化为在0~n-m+1之间产生一个随机数,然后递归由底至顶求解,代码如下:

flordy(n,m,array[])

{

  if(m>0){    

      flordy(n-1,m-1);

       t=rand%n;

      if(! isIn(t))

      {  //当m=1时递归到最底层,此时开始填充array 

         array[m-1]=t;

      }       

}

 代码是不是很短呀,呵呵

 

posted on 2011-10-14 20:02  kookest  阅读(329)  评论(0)    收藏  举报