我有以下列表:
["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语句没有输出任何内容。
答案 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的元素的列表上,它根本不会终止!