我如何在文本文件中仅以随机顺序打印每行一次?
我有一个包含六行的文本文件,我试图将它们随机打印到屏幕上
这是我到目前为止的代码
cout
我可以将元素“ s”添加到列表中。打印列表中的元素可以像下面这样简单,但是,我不确定如何随机打印列表中的元素。
open Scanf
open Printf
let id x = x
let const x = fun _ -> x
let read_line file = fscanf file "%s@\n" id
let is_eof file = try fscanf file "%0c" (const false) with End_of_file -> true
let _ =
let file = open_in "text.txt" in
while not (is_eof file) do
let s = read_line file in
printf "%s\n" s
done;
close_in file
答案 0 :(得分:3)
使用随机比较器对列表进行排序。例如,通过以下功能。
let mix =
let random _ _ =
if Random.bool() then 1 else -1 in
List.sort random
编辑1 (15.11.20)
List.sort实现Merge Sort算法。合并排序具有稳定的O(n log n)。同样,该算法的步数不取决于项目比较的结果。这意味着我们不确定的随机函数不会影响List.sort工作的时间。 (下图来自维基百科)
如果我们的输入数据是列表,并且我们不能使用可变的数据结构-我认为不可能实现比O(n log n)更好的Big O的解决方案,因为列表是不变的,并且必须具有对项目的随机访问权限
答案 1 :(得分:0)
让我们定义一个函数,该函数检索一个由其在列表中的位置标识的元素,并返回一个元组(this_element,the_list_wo_this_element)。
Ex : pick [0;2;4;6;8] 3
returns (6, [0;2;4;8)).
然后,通过迭代结果列表(上面的元组的rhs),从该列表中选择一个随机元素,直到该列表为空。