OCaml的解决方法是什么:异常Invalid_argument("Random.int")?

Ste*_*anu 2 random int ocaml arguments

我有这段代码:

let rec random_list = function
  | 0 -> []
  | n -> ( Random.int max_int ) :: ( random_list (n-1) )
Run Code Online (Sandbox Code Playgroud)

编译好了,但是当我执行它时,出现此错误:

exception Invalid_argument("Random.int")
Run Code Online (Sandbox Code Playgroud)

这个问题的解决方法是什么?

Thé*_*ter 9

文件说:

Random.int bound返回0(包含)和bound(不包括)之间的随机整数.bound必须大于0和小于2^30.

所以最接近你想要的是:

let my_max_int = (1 lsl 30) - 1 in
Random.int my_max_int
Run Code Online (Sandbox Code Playgroud)

正如gsg建议的那样,使用Random.bits ()更清洁来获得几乎相同的结果(它也可以返回2^30 - 1).

如果你真的想得到任何正的原生整数,也许你可以使用Random.nativeint,但这意味着你必须使用模块NativeintNativeint.t不是int.

  • `Random.bits()`与上面的不一样,因为`Random.bits()`生成一个随机的30位正整数,它可以产生2 ^ 30-1,而`Random.int((1 lsl) 30) - 1)`不能产生2 ^ 30-1. (2认同)