按长度过滤列表中的元素 - Ocaml

时间:2010-11-29 04:33:10

标签: random ocaml

我有以下列表:

["A";"AA";"ABC";"BCD";"B";"C"]

我从列表中随机提取一个元素。但是我提取的元素的大小应该不小于3。

我想按照以下方式执行此操作:

let randomnum = (Random.int(List.length (list)));;
let rec code c =
    if (String.length c) = 3 then c
    else (code ((List.nth (list) (randomnum)))) ;;
print_string (code ( (List.nth (list) (randomnum)))) ;;

如果从列表中随机挑出一个长度为3的字符串,这样可以正常工作。

但是如果字符串的长度<1,则程序不会终止。 3被拿起。 我正在尝试进行递归调用,以便新代码在获取长度= 3之前一直被拾取。

我无法弄清楚为什么这不会终止。 print语句没有输出任何内容。

3 个答案:

答案 0 :(得分:4)

你可能想写的是

 let rec code list =
   let n = Random.int (List.length list) in
   let s = List.nth list in
   if String.length s < 3 then code list else s

请注意,根据列表的大小和大小超过3的字符串数,您可能希望直接在仅包含大于3的字符串的列表上工作:

let code list =
  let list = List.filter (fun s -> String.length s >= 3) list in
  match list with
  | [] -> raise Not_found
  | _  -> List.nth list (Random.int (List.length list)) 

第二个函数更好,因为它总是终止,特别是当没有大于3的字符串时。

答案 1 :(得分:3)

您只需选择一次随机数。假设您选择5.您只需要一遍又一遍地继续使用5。你需要得到一个新的随机数。

答案 2 :(得分:1)

要终止代码,最好首先过滤列表中的合适元素,然后取随机数:

let code list =
   let suitables = List.filter (fun x -> String.length x = 3) list in
   match List.length suitables with
   | 0 -> raise Not_found (* no suitable elements at all! *)
   | len -> List.nth suitables (Random.int len)

否则,您的代码将非常长以终止于大小为&lt;&gt;的大型元素列表3;或者更糟糕的是在没有大小为3的元素的列表上,它根本不会终止!

相关问题