我有一个文本文件,其中包含一个按精确顺序排列的单词列表。 我正在尝试创建一个从该文件返回单词数组的函数。我设法按照与文件相同的顺序检索单词,如下所示:
char *readDict(char *fileName) {
int i;
char * lines[100];
FILE *pf = fopen ("francais.txt", "r");
if (pf == NULL) {
printf("Unable to open the file");
} else {
for (i = 0; i < 100; i++) {
lines[i] = malloc(128);
fscanf(pf, "%s", lines[i]);
printf("%d: %s\n", i, lines[i]);
}
fclose(pf);
return *lines;
}
return "NULL";
}
我的问题是:如何从文本文件中返回一个包含随机单词的数组;不是按照文件的顺序?
文件看起来像这样:
exemple1
exemple2
exemple3
exemple4
最佳答案
Reservoir sampling允许您从不确定大小的流中选择随机数量的元素。像这样的东西可以工作(虽然未经测试):
char **reservoir_sample(const char *filename, int count) {
FILE *file;
char **lines;
char buf[LINE_MAX];
int i, n;
file = fopen(filename, "r");
lines = calloc(count, sizeof(char *));
for (n = 1; fgets(buf, LINE_MAX, file); n++) {
if (n <= count) {
lines[n - 1] = strdup(buf);
} else {
i = random() % n;
if (i < count) {
free(lines[i]);
lines[i] = strdup(buf);
}
}
}
fclose(file);
return lines;
}
这是“算法 R”:
- 将前
count
行读入示例数组。 - 对于后续的每一行,以
count/n
的概率替换样本数组中的一个随机元素,其中n
是行号。 - 最后,样本包含一组随机线。 (顺序并不是完全随机的,但您可以通过随机播放来解决这个问题。)
关于C - 从文本文件中获取随机单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43214157/