【发布时间】:2012-09-16 13:33:26
【问题描述】:
void getS(char *fileName){
FILE *src;
if((src = fopen(fileName, "r")) == NULL){
printf("%s %s %s", "Cannot open file ", fileName, ". The program is now ending.");
exit(-1);
}
//char *get = " ";
int c = 1;
char ch = 'x';
while(ch!=EOF) {
ch = fgetc(src);
if(ch == '\n') c++;
}
fseek(src, 0, SEEK_SET);
int random = rand() % c;
int i = 0;
for(i = 0; i < random; i++){
while(ch != '\n'){
ch = fgetc(src);
}
}
do{
ch = fgetc(src);
if(ch != '\n' && ch != EOF){
printf("%c", ch);
}
}while(ch != '\n' && ch != EOF);
printf("%c", '\n');
fclose(src);
}
所以这是我的函数,它抓取一个文件并打印出文件中的一个随机单词,如果每个单词由一个新行分隔。
问题 1: 为什么随机的会偏爱前两个词?
问题 2:我将如何制作它以便我可以多次使用此功能而无需执行 printf("%c", '\n');因为如果我最后没有那个,之前的函数调用只会覆盖旧的。
在此先感谢,我今天一直在问一些问题,感谢 stackoverflow 的所有帮助! :)
附:使用 srand(time(NULL));
【问题讨论】:
-
%运算符总是有一些偏差,除非可能的随机值的数量完全可整除,尽管这可能不是一个重要问题。但是,有一个巧妙的技巧可以避免需要两次通过文件。当您找到第一个单词时,您有 100% 的机会选择它。当您找到第二个单词时,您有二分之一的机会选择它。当您找到第三个单词时,您有三分之一的机会选择它,依此类推。您需要生成大量随机数,但这通常比两次遍历文件要便宜。 -
您可能需要仔细检查概率才能对此感到满意,但是是的,它确实会选择最后概率相等的任何单词。最近有一篇博文提到了这一点,但我失去了链接。
-
你可以用
putchar(ch)代替printf("%c", ch)...这样更清晰更快捷。
标签: c function text methods random