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
。在这种情况下,它的形式很糟糕,因为它可能会导致混淆参数的用途。

我还建议使用多态变体,而不是使用字符串。我不知道,在更大的上下文中使用字符串可能有意义,但这是值得怀疑的。