楼主没有明白C提供的rand的使用方法,rand需要先使用srand(seed)设置随机种子,不然,如果采用缺省种子,程序将每次运行(启动)都是一样样的。种子只要设置一次就够了,后面无需重复设置。
rand是个伪随机算法,相同的种子,得到的随机序列是一样的。所以srand时,才有采用系统时钟的说法,因为,系统时钟是我们最容易得到的一个时变值(当然,这个随机并不怎么可靠,攻击者可以相对轻松地得到这个种子,从而得到随机序列)。
还有,楼主都不考虑程序运行效率的,一个"while(a[t=rand((unsigned)time(&mytime))%n] != 0);",将浪费多少CPU宝贵时间啊。还好,程序只要求得到24个值,要是240,2400,甚至更多,那么CPU得在这个循环中浪费许多资源。因为,随机仅仅表示“下一个不可预知”,并不表示下一个不会和之前的重复。如果要得到一个足够大的无重复随机序列,这段函数有可能直接就死机了。
以下是参考(运行于Windows)
void RandArray(int *a, int n)
{
int i;
int r;
for(i = 0; i < n; i++){
a[i] = i;
}
while(i > 0){
r = rand() % i;
i -= 1;
if(r != i){
int t = a[i]; a[i] = a[r]; a[r] = t;
}
}
}
int main(int argc, char *argv[])
{
int j,k;
int a[24];
srand(GetTickCount());
while(1){
RandArray(a,24);
printf("result:");
for(j = 0; j < 24; j++){
printf(" %02d", a[j]);
for(k = j+1; k < 24; k++){
if(a[j] == a[k]){
printf("\r\nError: a[%u] == a[%u] = %02X\r\n", j,k,a[j]);
break;
}
}
}
printf("\r\n");
Sleep(1000);
}
}
):
|