Hi, By accident I came across a pseudo random number generator that I never heard off before. It is supposed to be pretty good and had a very simple implementation. So I ported it to Pharo. <class comment> I am RandomWELL512, a random number generator. I use the PRNG (Pseudo Randon Number Generator) WELL (Well equidistributed long-period linear) with a 512 bit state. https://en.wikipedia.org/wiki/Well_equidistributed_long-period_linear http://www.iro.umontreal.ca/~lecuyer/myftp/papers/wellrng.pdf Implementation algorithm (See #nextUInt32) http://www.lomont.org/Math/Papers/2008/Lomont_PRNG_2008.pdf (Chris Lomont, www.lomont.org) Usage RandomWELL512 new in: [ :r | (1 to: 10) collect: [ :i | r nextUInt32 ] ]. RandomWELL512 new useUnixRandomGeneratorSeed; in: [ :r | (1 to: 10) collect: [ :i | r next ] ]. RandomWELL512 new in: [ :r | (1 to: 10) collect: [ :i | r nextInt: 1000 ] ]. RandomWELL512 new in: [ :random | | count all | random useUnixRandomGeneratorSeed. count := 1024 * 1024. all := Array new: count streamContents: [ :out | count timesRepeat: [ out nextPut: random next ] ]. { all min. all max. all average. all stdev } ]. [ RandomWELL512 new in: [ :random | 1 to: 1e6 do: [ :i | random next ] ] ] timeToRun. Note that you should create one instance, seed it properly, and keep using it. </class comment> It is acceptably fast, generating 1M [0,1) Floats in about 0.1s. I compared the output with a fixed initial state to the C code that I started from and I got the same numbers. Maybe some people find this interesting. I attached a file out. Sven
Can you contribute your code to PolyMath: https://github.com/PolyMathOrg/PolyMath We have other RNGs available. Thank you. On Fri, Nov 9, 2018 at 3:23 PM Sven Van Caekenberghe <sven@stfx.eu> wrote:
Hi,
By accident I came across a pseudo random number generator that I never heard off before. It is supposed to be pretty good and had a very simple implementation. So I ported it to Pharo.
<class comment>
I am RandomWELL512, a random number generator.
I use the PRNG (Pseudo Randon Number Generator) WELL (Well equidistributed long-period linear) with a 512 bit state.
https://en.wikipedia.org/wiki/Well_equidistributed_long-period_linear http://www.iro.umontreal.ca/~lecuyer/myftp/papers/wellrng.pdf
Implementation algorithm (See #nextUInt32)
http://www.lomont.org/Math/Papers/2008/Lomont_PRNG_2008.pdf (Chris Lomont, www.lomont.org)
Usage
RandomWELL512 new in: [ :r | (1 to: 10) collect: [ :i | r nextUInt32 ] ].
RandomWELL512 new useUnixRandomGeneratorSeed; in: [ :r | (1 to: 10) collect: [ :i | r next ] ].
RandomWELL512 new in: [ :r | (1 to: 10) collect: [ :i | r nextInt: 1000 ] ].
RandomWELL512 new in: [ :random | | count all | random useUnixRandomGeneratorSeed. count := 1024 * 1024. all := Array new: count streamContents: [ :out | count timesRepeat: [ out nextPut: random next ] ]. { all min. all max. all average. all stdev } ].
[ RandomWELL512 new in: [ :random | 1 to: 1e6 do: [ :i | random next ] ] ] timeToRun.
Note that you should create one instance, seed it properly, and keep using it.
</class comment>
It is acceptably fast, generating 1M [0,1) Floats in about 0.1s. I compared the output with a fixed initial state to the C code that I started from and I got the same numbers. Maybe some people find this interesting.
I attached a file out.
Sven
-- Serge Stinckwic h Int. Research Unit on Modelling/Simulation of Complex Systems (UMMISCO) Sorbonne University (SU) French National Research Institute for Sustainable Development (IRD) U niversity of Yaoundé I, Cameroun "Programs must be written for people to read, and only incidentally for machines to execute." https://twitter.com/SergeStinckwich
I was about to say letâs add this to the Cryptography package ð
Am 09.11.2018 um 15:34 schrieb Serge Stinckwich <serge.stinckwich@gmail.com>:
Can you contribute your code to PolyMath: https://github.com/PolyMathOrg/PolyMath We have other RNGs available.
Thank you.
On Fri, Nov 9, 2018 at 3:23 PM Sven Van Caekenberghe <sven@stfx.eu> wrote: Hi,
By accident I came across a pseudo random number generator that I never heard off before. It is supposed to be pretty good and had a very simple implementation. So I ported it to Pharo.
<class comment>
I am RandomWELL512, a random number generator.
I use the PRNG (Pseudo Randon Number Generator) WELL (Well equidistributed long-period linear) with a 512 bit state.
https://en.wikipedia.org/wiki/Well_equidistributed_long-period_linear http://www.iro.umontreal.ca/~lecuyer/myftp/papers/wellrng.pdf
Implementation algorithm (See #nextUInt32)
http://www.lomont.org/Math/Papers/2008/Lomont_PRNG_2008.pdf (Chris Lomont, www.lomont.org)
Usage
RandomWELL512 new in: [ :r | (1 to: 10) collect: [ :i | r nextUInt32 ] ].
RandomWELL512 new useUnixRandomGeneratorSeed; in: [ :r | (1 to: 10) collect: [ :i | r next ] ].
RandomWELL512 new in: [ :r | (1 to: 10) collect: [ :i | r nextInt: 1000 ] ].
RandomWELL512 new in: [ :random | | count all | random useUnixRandomGeneratorSeed. count := 1024 * 1024. all := Array new: count streamContents: [ :out | count timesRepeat: [ out nextPut: random next ] ]. { all min. all max. all average. all stdev } ].
[ RandomWELL512 new in: [ :random | 1 to: 1e6 do: [ :i | random next ] ] ] timeToRun.
Note that you should create one instance, seed it properly, and keep using it.
</class comment>
It is acceptably fast, generating 1M [0,1) Floats in about 0.1s. I compared the output with a fixed initial state to the C code that I started from and I got the same numbers. Maybe some people find this interesting.
I attached a file out.
Sven
-- Serge Stinckwich Int. Research Unit on Modelling/Simulation of Complex Systems (UMMISCO) Sorbonne University (SU) French National Research Institute for Sustainable Development (IRD) University of Yaoundé I, Cameroun "Programs must be written for people to read, and only incidentally for machines to execute." https://twitter.com/SergeStinckwich
On Fri, Nov 9, 2018 at 5:54 PM Norbert Hartl <norbert@hartl.name> wrote:
I was about to say letâs add this to the Cryptography package ð
How much RNGs are implemented in the crypto packages ? Maybe we need to sync one day :-) -- Serge Stinckwic h Int. Research Unit on Modelling/Simulation of Complex Systems (UMMISCO) Sorbonne University (SU) French National Research Institute for Sustainable Development (IRD) U niversity of Yaoundé I, Cameroun "Programs must be written for people to read, and only incidentally for machines to execute." https://twitter.com/SergeStinckwich
I remember that I collected many of them and put them in PolyMath. On Fri, Nov 9, 2018 at 6:40 PM Serge Stinckwich <serge.stinckwich@gmail.com> wrote:
On Fri, Nov 9, 2018 at 5:54 PM Norbert Hartl <norbert@hartl.name> wrote:
I was about to say letâs add this to the Cryptography package ð
How much RNGs are implemented in the crypto packages ? Maybe we need to sync one day :-)
-- Serge Stinckwic h
Int. Research Unit on Modelling/Simulation of Complex Systems (UMMISCO) Sorbonne University (SU) French National Research Institute for Sustainable Development (IRD) U niversity of Yaoundé I, Cameroun "Programs must be written for people to read, and only incidentally for machines to execute." https://twitter.com/SergeStinckwich
participants (4)
-
Norbert Hartl -
Serge Stinckwich -
Stephane Ducasse -
Sven Van Caekenberghe