在OCAML或Telling编译器中获取函数中的随机数,以便每次都评估函数

问题描述 投票:0回答:1

我是OCAML的新手,正在玩一个随机5X5平方的标记。我已经编写了下面的示例程序。 “silly_method1”有效,但请注意它需要参数。我真的没有理由为我想要的东西传递。我只想要一个随机数来在特定的方格上创建我的机器人:

let create = {x = ( Random.int 4); y=3; face = North}

但是,我每次都得到相同的位置。这对我有意义......有点儿。我假设我的设置方式,“创造”基本上是一个常数。它被评估过一次,就是这样!我已经在silly_method2中修复了它,但看起来有多难看!

let silly_method2 _ = (Random.int 10)

每次我必须打电话给它,即使我没有真正使用它,我也必须传递论据。

这样做的正确方法是什么?必须有一些方法可以使一个函数不带参数并传回一个随机数(或随机元组等)并且可能相关...有没有办法告诉OCaml不要一次评估函数并保存结果而是每次重新计算答案?

谢谢你对我的耐心!

戴夫

let _ = Random.self_init()

let silly_method1 x = x + (Random.int 10)
let silly_method2 _ = (Random.int 10)
let report1 x = (print_newline(); print_string("report1 begin:  "); print_int (silly_method1 x); print_string("report1 end"); print_newline(); )
let report2 y = (print_newline(); print_string("report2 begin:  "); print_int(silly_method2 y ); print_string("report2 end"); print_newline(); )

let _ = report1 3
let _ = report1 3
let _ = report1 3

let _ = report2 3
let _ = report2 3
let _ = report2 3
random functional-programming ocaml random-seed
1个回答
0
投票

在OCaml中定义一个不带参数的函数的惯用方法是使参数为(),它是unit类型的值(唯一值):

# let f () = Random.int 10;;
val f : unit -> int = <fun>
# f ();;
- : int = 5
# f ();;
- : int = 2

OCaml不保存功能结果以供以后重复使用。如果你想要这种行为,你必须使用lazy明确要求它。

© www.soinside.com 2019 - 2024. All rights reserved.