(* Kurver.sml * Copyright 1998 Peter Sestoft. Må kopieres og modificeres jvfr. GNU General Public License *) fun kurver () = let val gen = Random.newgen () val ser = Random.range (4, 8) gen val n = Random.range (20, 30) gen fun mkseries trend = List.tabulate(n, fn i => trend i * (1.0 - 0.3 * Random.random gen)) fun trend1 i = real i / 2.0 + 2.0; fun trend2 i = real (n-i) / 3.0 + 2.0; fun trend3 i = Math.ln (real (i+1)) * 4.0 + 2.0 fun trend4 i = real (abs (n div 2 - i)) + 2.0 val trendlist = List.take([trend1, trend2, trend3, trend4, trend1, trend2, trend3, trend4], ser) val trends = Array.fromList trendlist fun permutearray arr = let val len = Array.length arr fun swaprandom (i, a) = let val j = Random.range (0, len) gen in Array.update(arr, i, Array.sub(arr, j)); Array.update(arr, j, a) end in Array.appi swaprandom (arr, 0, NONE) end val _ = permutearray trends val data = Array.foldr (fn (t, res) => mkseries t :: res) [] trends fun loop 0 tilnu = tilnu | loop i res = let val (_, _, ordsek, ok) = Substant.vaelg (SOME (Basis.ubs, Basis.flt)) in if ok andalso List.all (fn ord1 => ord1 <> ordsek) res then loop (i-1) (ordsek :: res) else loop i res end val tekster = List.map (Format.flatten o Format.begyndelse) (loop ser []) in Gdimage.stdoutGif (Graphs.accugraph (550, 220) data tekster) end val _ = kurver ();