关于随机序列的算法
前几天做了个斗地主纸牌程序,根据常理要求三位玩家手中的牌为总数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;
}
}
}
代码是不是很短呀,呵呵
浙公网安备 33010602011771号