commit 2d5378fd534321d11ca5ec22804210860d2c6833 parent 37a2dab610e9501d16c8fb194038779d55d45949 Author: NunoSempere <nuno.sempere@protonmail.com> Date: Sun, 15 Oct 2023 01:58:03 +0100 tweak: in ocaml, do the unwinding and the sum at the same time Diffstat:
| M | ocaml/out/samples | | | 0 | |
| M | ocaml/out/samples.cmi | | | 0 | |
| M | ocaml/out/samples.cmx | | | 0 | |
| M | ocaml/out/samples.o | | | 0 | |
| M | ocaml/samples.ml | | | 15 | ++++++++++++--- |
5 files changed, 12 insertions(+), 3 deletions(-)
diff --git a/ocaml/out/samples b/ocaml/out/samples Binary files differ. diff --git a/ocaml/out/samples.cmi b/ocaml/out/samples.cmi Binary files differ. diff --git a/ocaml/out/samples.cmx b/ocaml/out/samples.cmx Binary files differ. diff --git a/ocaml/out/samples.o b/ocaml/out/samples.o Binary files differ. diff --git a/ocaml/samples.ml b/ocaml/samples.ml @@ -54,6 +54,15 @@ let unwind xs = ) *) +let unwindSum xs = + let rec tailRecursiveHelper ys sum = + match ys with + | [] -> Ok(sum) + | Error e :: _ -> Error e + | Ok(y) :: ys -> tailRecursiveHelper ys (y +. sum) + in + tailRecursiveHelper xs 0.0 + (* Basic samplers *) let sampleZeroToOne () : float = Random.float 1.0 @@ -104,9 +113,9 @@ let () = let sampler () = mixture [ sample0; sample1; sampleFew; sampleMany ] weights in let n = 1_000_000 in let samples = List.init n (fun _ -> sampler ()) in - match unwind samples with + match unwindSum samples with | Error err -> Printf.printf "Error %s\n" err - | Ok(xs) -> ( - let mean = sumFloats xs /. float_of_int(n) in + | Ok(sum) -> ( + let mean = sum /. float_of_int(n) in Printf.printf "Mean: %f\n" mean )