在 OCAML 中的函数中获取随机数或告诉编译器每次评估函数
Getting a random number in a function in OCAML OR Telling compiler to evaluate function each time
我是 OCAML 的新手,正在尝试在随机的 5X5 正方形上放置一个标记。我已经编写了下面的示例程序。 "silly_method1" 有效,但请注意它需要一个参数。我真的没有理由传递我想要的东西。我只是要求一个随机数来在特定的方块上创建我的机器人:
let create = {x = ( Random.int 4); y=3; face = North}
但是,我每次都得到相同的位置。这对我来说很有意义......有点。我假设我设置它的方式 "create" 基本上是一个常数。它被评估一次,就是这样!我已经在下面 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
在 OCaml 中定义不接受参数的函数的惯用方法是让参数为 ()
,它是 unit
类型的值(唯一值):
# let f () = Random.int 10;;
val f : unit -> int = <fun>
# f ();;
- : int = 5
# f ();;
- : int = 2
OCaml 不保存函数结果供以后重复使用。如果你想要这种行为,你必须使用 lazy
.
明确要求它
我是 OCAML 的新手,正在尝试在随机的 5X5 正方形上放置一个标记。我已经编写了下面的示例程序。 "silly_method1" 有效,但请注意它需要一个参数。我真的没有理由传递我想要的东西。我只是要求一个随机数来在特定的方块上创建我的机器人:
let create = {x = ( Random.int 4); y=3; face = North}
但是,我每次都得到相同的位置。这对我来说很有意义......有点。我假设我设置它的方式 "create" 基本上是一个常数。它被评估一次,就是这样!我已经在下面 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
在 OCaml 中定义不接受参数的函数的惯用方法是让参数为 ()
,它是 unit
类型的值(唯一值):
# let f () = Random.int 10;;
val f : unit -> int = <fun>
# f ();;
- : int = 5
# f ();;
- : int = 2
OCaml 不保存函数结果供以后重复使用。如果你想要这种行为,你必须使用 lazy
.