【发布时间】:2015-04-15 13:46:31
【问题描述】:
这段代码应该做的是洗牌一个数组,但每次我在 a 上运行它时,我都会得到相同的“洗牌”数组(当然通过输入相同的未洗牌数组)我认为srand(time(NULL)); 部分会确保这一点。如果不是这样,我不知道如何让它真正洗牌。
所以总结一下,我需要知道为什么我的代码每次都以同样的方式洗牌。
# include <stdio.h>
# include <stdlib.h>
# include <math.h>
# include <time.h>
int main(){
int n;
int m;
int tmp;
int i;
printf("Please input the number of elements in your array:\n");
scanf("%d", &n);
int baraja[n];
int tempbaraja[n];
for (int i = 0; i < (sizeof(baraja)/sizeof(baraja[0])); i ++){
printf("Please input the %d element of your array:\n",i);
scanf("%d",&baraja[i]);
}
printf("Unshuffled array:\n");
for (i=0;i < n;i++) {
printf(" %d \n",baraja[i]);
}
for (int i = 0; i < n; i ++){
tempbaraja[i] = baraja[i];
}
for (int i = 0; i < n; i ++){
srand(time(NULL));
m = rand() % n;
if (tempbaraja[m] == baraja[m]){
tmp = baraja[m];
baraja[m] = baraja[i];
baraja[i] = tmp;
}else{
}
}
printf("Shuffled array:\n");
for (i=0;i < n;i++) {
printf(" %d \n",baraja[i]);
}
}
【问题讨论】:
-
srand(time(NULL))应该只被调用一次,最好在程序开始时调用。 -
@remyabel 能否请您具体扩展您的答案,为什么如果我迭代每次迭代时种子都会改变,为什么只调用一次?
-
因为
srand()将rand()序列重置为已知的可重复点。所以rand()总是返回相同的“随机”(不是!)数字。通过在程序开始时调用srand(time(NULL)),每次运行都会得到不同的序列。