From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Original-To: caml-list@yquem.inria.fr Delivered-To: caml-list@yquem.inria.fr Received: from mail4-relais-sop.national.inria.fr (mail4-relais-sop.national.inria.fr [192.134.164.105]) by yquem.inria.fr (Postfix) with ESMTP id B2AF9BBAF for ; Thu, 3 Dec 2009 16:11:05 +0100 (CET) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqsAAJdjF0uBrw8EmWdsb2JhbACEOIt2i2EBAQEBAQgLCgcTq1OQb4EvgixXBIFn X-IronPort-AV: E=Sophos;i="4.47,335,1257116400"; d="scan'208";a="51446608" Received: from ext.lri.fr ([129.175.15.4]) by mail4-smtp-sop.national.inria.fr with ESMTP/TLS/ADH-AES256-SHA; 03 Dec 2009 16:11:04 +0100 Received: from localhost (localhost [127.0.0.1]) by ext.lri.fr (Postfix) with ESMTP id A5EB5A4402; Thu, 3 Dec 2009 16:11:04 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at lri.fr Received: from ext.lri.fr ([127.0.0.1]) by localhost (ext.lri.fr [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id DSqezNOh5yyr; Thu, 3 Dec 2009 16:11:04 +0100 (CET) Received: from lri4-139 (lri4-110 [129.175.4.110]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ext.lri.fr (Postfix) with ESMTP id 78302A4284; Thu, 3 Dec 2009 16:11:04 +0100 (CET) Content-Type: text/plain; charset=utf-8; format=flowed; delsp=yes To: =?utf-8?Q?Daniel_B=C3=BCnzli?= , AUGER Cc: caml-list@inria.fr Subject: Re: [Caml-list] Random questions References: <91a3da520911180259s585b5ef5j311bd0448ed3c02f@mail.gmail.com> <91a3da520912030648u62aac252g6faddf06892646d9@mail.gmail.com> Date: Thu, 03 Dec 2009 16:11:04 +0100 MIME-Version: 1.0 Content-Transfer-Encoding: Quoted-Printable From: AUGER Organization: ProVal Message-ID: In-Reply-To: <91a3da520912030648u62aac252g6faddf06892646d9@mail.gmail.com> User-Agent: Opera Mail/10.00 (Linux) X-Spam: no; 0.00; lri:01 0100,:01 buenzli:01 bool:01 bool:01 semantics:01 reasonnable:01 uniformly:01 beginner's:01 ocaml:01 bug:01 paris-sud:01 lri:01 umr:01 orsay:01 Le Thu, 03 Dec 2009 15:48:37 +0100, Daniel B=C3=BCnzli = a =C3=A9crit: > Hello Cedric, > > Thanks for your comments. Comments on your comments. > >> let rint () =3D (Random.bits () lsl 1) lxor (Random.bits ());; > > That was actually my first version. However I dropped it because I > thought that generating a new random number by the interaction of the > bits of two successive PRN could somehow change the underlying quality= > of the generator. Any thought ? If it is the case, then the generation is of bad quality... If you can predict the generated values of such combinations, then it is easy to predict the values of the base generator; which is then a bad generator. (What I say is not valid for non reversible combination, such as "or" or= = "and", even if it implies that generator is of poor quality too; and not valid for complex operation, such as emulating the generator = itself). I am not expert in this domain, so it is better to directly ask on = specialists. > >> if Random.bool is more efficient than Random.bits, the latter seems t= he >> best; to be benchmarked > > Random.bool is Random.bits () land 0 =3D 1. ok, so this function is not as interessant as I thought. > >>> 2) Generate an arbitrary int in [0;max] (bounds included) >>> >>> let random_uint ?(max =3D max_int) =3D >>> if max < 0 then invalid_arg "negative max" else >>> if max =3D max_int then Random.bits else >>> let bound =3D max + 1 in >>> fun () -> Random.int bound >> >> Seems correct. >> I don't know if use of exception is more efficient or not, it is to t= ry: >> >> let random_uint ?(max =3D max_int) () =3D >> try if max =3D max_int then Random.bits () else Random.int (max + 1)= >> with Invalid_argument "Random.int" -> invalid_arg "negative max" > > You lose the ability to partially apply random_uint with the max and > avoid the if on each call. > > >> I think it is better to use the bool trick; >> simpler and doesn't use Int32: >> >> let random_int ?(max =3D max_int) =3D >> if max < 0 then invalid_arg "negative max" else >> if max =3D 0 then 0 else >> if Random.bool () >> then if max =3D max_int then Random.bits () >> else Random.int max >> else negate_minus_1 (Random.int (max - 1)) (* inline? *) >> > > Yes, thanks. Your version can also be reordered to be partially = > applicable. > > It should also be noted that all our functions for [int]s don't work > with the intended semantics on 64 bits platforms. I noticed it, but I may have forgot to write it down. > >>> 5) Generate an arbitrary float in [0;max] (bounds included) >>> >>> let after_one =3D 1. +. epsilon_float >>> let random_ufloat ?(max =3D max_float) =3D >>> if max < 0. then invalid_arg "negative max" else >>> fun () -> (Random.float after_one) *. max >> >> This function is less interesting than Random.float: >> only less or as many as values as floats in [0.;1.] can be generated >> so you will miss many values only to be able to produce max >> (for example, you cannot 1+eps if you try random_ufloat ~max:2. ()) > > The point you make maybe valid but unfortunately that's also the case > for Random.float as this is the way it is implemented (generate a > number in [0;1[ and scale it). Ok, in fact it is reasonnable to do it since generating a random bit = sequence (uniformly) won't lead to a uniform law on floats, taking the exposant in = consideration, will result in more fine grained generator, but at a rather high cost. and between 0 and 1 you can use int generation. Furthermore, use of generated random floats is often done in [0;1] (as i= t = is a probability). > > Best, > > Daniel > > _______________________________________________ > Caml-list mailing list. Subscription management: > http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list > Archives: http://caml.inria.fr > Beginner's list: http://groups.yahoo.com/group/ocaml_beginners > Bug reports: http://caml.inria.fr/bin/caml-bugs -- = C=C3=A9dric AUGER Univ Paris-Sud, Laboratoire LRI, UMR 8623, F-91405, Orsay