我正在试图弄清楚如何随机对字符串中的字符进行排序,例如"此"," htis"或" tish",或者" HSIT&#34 ;.我相信我的问题在于rand()可能在循环中两次选择相同的随机数。例如第二个字符在循环期间应用两次。我也很确定在某个时刻这个循环在循环的最后一次迭代期间也没有任何东西可以选择。
我的代码如下:
int main(void){
setvbuf(stdout,NULL,_IONBF,0);
int size=0;
char word[size];
int i;
printf("Please enter a word: ");
scanf(" %s",&word);
printf("Scanning the size of the word...");
size = strlen(word);
for(i=0;i<size;i++){
srand(time(0));
int j = i + rand() / (RAND_MAX / (size - i) + 1);
char t = word[j];
word[j] = word[i];
word[i] = t;
}
printf("%i",size);
for(i=1;i<size+1;i++){
printf(" %c",word[i]);
}
return 0;
}
有什么想法吗?
答案 0 :(得分:1)
您的实现问题是您在循环中调用srand
。由于循环进行得非常快,因此你可以使用相同的种子值调用srand
,因为time(0)
没有机会在循环迭代之间勾选。
将呼叫移至循环外的srand
以解决此问题。
注意:请参阅this answer以获得Fisher-Yates shuffle的良好C实现。