最近想写一个1A2B的小游戏来练习一下,结果在第一步生成随机数的时候就遇到了一点点问题。
游戏初始化时需要先生成一个四位随机数,且各位各不相等。于是最开始的思路是生成一个整数数组,只需要判断生成的随机数字是否跟之前的数字有重复,有则重新生成即可,但是之后发现两个问题。首先是,函数每次调用后生成的随机数是一样的。第二,生成的随机数如果0在第一位,则调用itoa函数时会被舍弃掉。
后来研究中发现,出现的原因是srand放在了函数里,每次调用函数都就重置随机数种子至初始值,于是就会出现生成的随机数都一样的情况。至于第二种错误,可以通过另一种方式来巧妙避免。代码如下,代码中的思路为:
先生成一个0-9的整数数组,再随机从中取一个数,只要不等于-1就将其取出放置到要生成的随机数中,并将该位置为-1。这样做也能提高一点点效率,而不用去删除数组成员。
/******************************************************************************
*函数名称:void GetRandom(char * random)
*函数功能:产生一个各位数不相等的四位随机数
*入口参数:random为返回的随机数
*返 回 值:无
*备 注:先生成一个0-9的整数数组,再随机从中取四个数,每取一个将该位置为-1
*******************************************************************************/
void GetRandom(char * random){
int i, j[], k;
for (i = ; i < ; i++){
j[i] = i;
}
for(i = ; i < ; i++){
//生成第i个随机数
k = (int)rand() % ;//k为下标
while (j[k] == -){
k = (k + ) % ;
}
random[i] = '' + j[k];
j[k] = -;
}
}