From: David Flanagan Date: 2007-06-13T07:03:27+09:00 Subject: Re: comments needed for Random class Since 0 and 1 are both treated as true in Ruby, it would be nice if the Random class had a method that would randomly return true or false: Random.maybe(probability_of_truth=0.5) A lot of random number generators can return numbers with a gaussian distribution. I've never used this feature, but someone must care about it. How about accepting a Range object as the argument to methods like integer, float, and rand. If a single numeric value is passed, then 0 is the implicit lower bound. Otherwise the argument is a range that specifies both the upper and lower bound. I haven't worked with binary I/O in Ruby yet, but would it ever be useful to have an infinite stream of random bytes? As an alternative to "pulling" random numbers from a Random object, could we also have iterator methods that yield random numbers to a block? It seems like this could be useful in testing and benchmarking frameworks to throw random input at existing code.... Enumerable.shuffle(Random): works like Enumerable.sort--takes any Enumerable as input and returns an array. I propose this because I vaguely remember reading something by Josh Bloch (Java API designer) about how it is actually quite tricky to correctly implement a random shuffle. I don't remember the details, however. David Flanagan NAKAMURA, Hiroshi wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA1 > > Hi all, > > # Especially to Technorama Ltd. > > We're discussing about introducing Random class for PRNG on ruby-dev ML. > > * current rand and srand changes global state. it should be the > source of a security problem sooner or later in this "framework" era. > (I claimed) > * Mats agreed to introduce a class for PRNG based on current Mersenne > Twister implementation. class name is "Random". > * no plan to introduce another PRNG based on other PRNG algorithm. > MT is the only PRNG engine for "Random". > * we're now discussing what methods "Random" should have. > > Here's my proposal (no agreement for now); > > Random#integer(max) > Ramdom#bytes(size) > Random#float # same as Random#rand(0). not needed? > Random#rand(max = 0) > Random#srand(seed = nil) > Random#seed=(seed = nil) # same as Random#srand(seed) > > Random.rand(max = 0) # calls Random#rand(max) of the singleton Random > # object which is initialized with the current > # srand(). > > rand(max = nil) # calls Random.rand(max) > srand() # srand() now takes no argument for 1.9. > > Comments needed. > > Regards, > // NaHi > > -----BEGIN PGP SIGNATURE----- > Version: GnuPG v1.4.5 (Cygwin) > > iQEVAwUBRm49vB9L2jg5EEGlAQIhCAf/cUqxCF7wkEwakEPkTaonfVvO5Firz1jh > obm8cr3tr4+8sEiY5WX6nLoI3laEOgVfiyjgmTmFY2L6b4ghyU3fcynzlLINSbPn > MehyWaSscamlaN28DkPv8Jq51hoIMTNsmTyA6QEVIKkN+m9DFdd4Jk0505kB9/yH > RdhMFsZ/wZXjJkbAEVIIxaenfn90tRydwcXF/PZRHNVjbi/r0U57wlmni+aoGWrO > 3bafFWymg0t+nlKY1Kajgy4cle/Cx3WaeZ2YoRTyp5HsBS5Tw0cUbwZDF8G14bVW > TWkDEe9nRG0e82Hh8ow6jqoUqOgIJBqi6/KfaoR7JQtXC2Bi0DbHiQ== > =ORxD > -----END PGP SIGNATURE----- >