整数Nまでの整数をランダムで返すStandard ML関数

整数Nまでの整数をランダムで返す関数

微妙なStandard MLコードを置いて宿題の邪魔をするコーナー。

プログラムはSML# version 1.2.0で動かしています。

今日は

整数Nまでの整数をランダムで返す関数と、その関数を実行しまくって分散をとる関数の抱き合わせ。

でも

これは次回で使うから仕方なく載せただけで、別に面白くないどころか、宿題の手助けにさえなりかねないので、解説なしで。一応言うと、実行して表示された数字が0に近いと嬉しい。

local
  exception Random
  val srand = _import "srand" : int -> unit
  val rand = _import "rand" : unit -> int
  val max = valOf Int.maxInt
  val _ = (srand o Int.fromLarge o Time.toSeconds o Time.now) ()
in
  fun randInt n = let
    val m = max - (max mod n)
    fun f a = if a < m then a mod n else f (rand ())
  in if n < m then f (rand ()) else raise Random end
end

val sum = foldr (op +) 0.0
fun average xs = sum xs / real (length xs)
fun sigma avr = Math.sqrt o average o map (fn x => Math.pow (x - avr, 2.0))

fun zeros n = List.tabulate (n, fn _ => 0)

fun checkRandom n m f = let
  val samples = List.tabulate (m, fn _ => f n)
  fun nthInc n cs =
      #2 (foldl (fn (c, (i, acc)) =>
                    (i+1, (if i = n then c + 1 else c) :: acc))
                (0, nil) cs)
  val counts = foldl (fn (n, counts) => nthInc n counts)
                     (zeros n) samples
  val odds = map (fn c => real c / real m) counts
in sigma (1.0 / real n) odds end

val _ = (print o Real.toString) (checkRandom (356 * 24) 100000 randInt)

なんかえらそうですが、全然えらくないので間違ってたら教えてください。

Post a Comment

Your email is never shared.

引く

PageTop