Random 在循环中重新生成随机数
我想创建一个基本的遗传算法,以便输出一组输入输入到仿真器中。基本上,它的作用是:Random 在循环中重新生成随机数,random,ocaml,Random,Ocaml,我想创建一个基本的遗传算法,以便输出一组输入输入到仿真器中。基本上,它的作用是: 生成输入表 列表项 运行所说的输入 稍微修改一下 运行它 查看哪个输入集表现更好,然后“分叉”并重复,直到问题得到解决 下面是我生成第一组输入的代码: (* RNG initialization * unit *) Random.self_init();; (* Generating a starting input file * array * 500 inputs long *) let f
- 生成输入表
- 列表项
- 运行所说的输入
- 稍微修改一下
- 运行它
- 查看哪个输入集表现更好,然后“分叉”并重复,直到问题得到解决
(* RNG initialization
* unit *)
Random.self_init();;
(* Generating a starting input file
* array
* 500 inputs long *)
let first_input =
let first_array = Array.make 500 "START" in
for i = 1 to 499 do
let input =
match Random.int(5) with
| 0 -> "A "
| 1 -> "B "
| 2 -> "DOWN "
| 3 -> "LEFT "
| 4 -> "RIGHT "
| _ -> "START " in
first_array.(i) <- input
done;
first_array;;
(* Mutating input_file
* Rate : in percent, must be positive and <= 100
* a must be an array of strings *)
let mutation a n=
let mutation_rate = n in
for i = 0 to ((Array.length(a) * mutation_rate / 100) - 1) do
let input =
match Random.int(5) with
| 0 -> "A "
| 1 -> "B "
| 2 -> "DOWN "
| 3 -> "LEFT "
| 4 -> "RIGHT "
| _ -> "START " in
a.( Random.int(498) + 1) <- input
done;;
(*RNG初始化
*单位*)
Random.self_init();;
(*生成起始输入文件
*排列
*500输入长*)
让我们先输入=
让first_array=array.make 500“开始”
对于i=1到499 do
让输入=
将Random.int(5)与
|0->“A”
|1->“B”
|2->“向下”
|3->“左”
|4->“对”
|->中的“开始”
第一个数组(i)“B”
|2->“向下”
|3->“左”
|4->“对”
|->中的“开始”
a、 (Random.int(498)+1)将其放入自己的函数中没有任何错误。您缺少的是使函数处理Random.int
的副作用的参数。由于您没有使用此参数,因此人们通常/总是使用unit
let random_input () = match Random.int 5 with
| 0 -> "A "
| 1 -> "B "
| 2 -> "DOWN "
| 3 -> "LEFT "
| 4 -> "RIGHT "
| _ -> "START "
这里要做的是模式匹配参数,因为只有一个构造函数,所以这种匹配是彻底的。但从技术上讲,您可以将上面的()
替换为。
。这将匹配任何使函数多态的参数,'a->string
。在这种情况下,它的形式很糟糕,因为它可能会导致混淆参数的用途。我还建议使用多态变体,而不是使用字符串。我不知道,在更大的上下文中使用字符串可能有意义,但这是值得怀疑的。