public
Description: Simulated annealing implementation in OCaml
Homepage:
Clone URL: git://github.com/khigia/ocaml-anneal.git
ocaml-anneal / rnd.ml
100644 38 lines (30 sloc) 0.788 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
module Shuffle = struct
 
    type 'a t = {
        values: 'a array;
        mutable pos: int;
    }
 
    let create values = {
        values = Array.copy values;
        pos = 0;
    }
 
    let _shuffle sh =
        let len = Array.length sh.values in
        if sh.pos < len
        then
            begin
            let idx = Random.int (len - sh.pos) in
            let tmp = sh.values.(sh.pos + idx) in
            sh.values.(sh.pos + idx) <- sh.values.(sh.pos);
            sh.values.(sh.pos) <- tmp;
            sh.pos <- sh.pos + 1;
            sh
            end
        else
            failwith "index error"
 
    let rec get sh idx =
        if idx < sh.pos
        then
            sh.values.(idx)
        else
            get (_shuffle sh) idx
 
end (* module Shuffle *)