caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Lauri Alanko <la@iki.fi>
To: caml-list@inria.fr
Subject: Generating random generators
Date: Sun, 9 May 2010 13:07:28 +0300	[thread overview]
Message-ID: <20100509100728.GA23132@ruuvi.it.helsinki.fi> (raw)

To parallelize a probabilistic algorithm while retaining
reproducibility, it is often useful to have several independent
streams of pseudo-random numbers. In Haskell, there is a standard
operation Random.split, which takes a PRNG state and produces two
new PRNG states which should hopefully produce two seemingly
unrelated number streams.

OCaml's random library works in an imperative setting where each
generation operation implicitly updates the state of the
generator, so the corresponding operation would simply be
generating a new random generator:

val spawn : Random.State.t -> Random.State.t

Alas, such an operation is not provided by the library. The most
straightforward implementation would be the following:

let spawn s =
  Random.State.make (Array.init 55 (fun _ -> Random.State.bits s))

However, random numbers are tricky, and I'm suspicious of just
adding a new operation ad hoc when I don't understand how the
underlying PRNG works. Hence, I'd appreciate if anyone could
offer some insight on whether the above approach has any hidden
pitfalls (i.e. some sort of regularity that might appear when the
values from two generated streams are combined in a particular
fashion), or if there is a faster way of generating new
generators robustly. Random.State.make invokes Digest.string for
every int of the seed, so it seems like overkill.

Thanks in advance.


Lauri


             reply	other threads:[~2010-05-09 10:07 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-05-09 10:07 Lauri Alanko [this message]
2010-05-11 16:01 ` [Caml-list] " Dario Teixeira

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20100509100728.GA23132@ruuvi.it.helsinki.fi \
    --to=la@iki.fi \
    --cc=caml-list@inria.fr \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).