从列表OCAML中随机打印

时间:2019-11-13 21:57:53

标签: ocaml

我如何在文本文件中仅以随机顺序打印每行一次?

我有一个包含六行的文本文件,我试图将它们随机打印到屏幕上

这是我到目前为止的代码

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

2 个答案:

答案 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工作的时间。 (下图来自维基百科)

enter image description here

如果我们的输入数据是列表,并且我们不能使用可变的数据结构-我认为不可能实现比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),从该列表中选择一个随机元素,直到该列表为空。

相关问题