文件中的随机行

pri*_*stc 5 language-agnostic

这个问题是在一次采访中给我的.采访已经结束了,但我仍然在考虑问题和它的烦恼:

您可以包含以下工具语言:一个rand()功能,whilefor循环,if语句和readline()方法(类似于Python的readline()).给定这些工具,编写一个在文件中返回随机行的算法.您不知道文件的大小,并且您只能循环文件的内容一次.

Luc*_*Luc 7

我不知道所需的答案,但我的解决方案如下:

chosen_line = ""
lines = 0

while (current_line = readline()):
    if (rand(0, lines) == 0):
        chosen_line = current_line

    lines++

return chosen_line
Run Code Online (Sandbox Code Playgroud)

编辑:这个评论中发布了一个很好的解释.

  • 如果您不明白为什么上面的代码有效,请通过这种方式思考:它采用概率为1的第一行.这对于一行是正确的.在第二行,它在一半的时间内切换到该行,因此它有一半的时间是第一行,一半是第二行,到目前为止是好的.在第三行,它占第三行1/3的时间.我们已经知道剩余时间的一半是第一行(1/3),剩余时间是第二行(1/3)的一半.三条线仍然很好.等等. (7认同)