Werner Smekal wrote:

Hi Alan,

We need a volunteer to step forward to change example 21 in C so that it
uses a simple random number generator that is internal to the example
(perhaps something extremely simple but reasonably effective if you pick a
"good" seed such as the middle square method described at
http://en.wikipedia.org/wiki/Middle-square_method) and also so that
execution times are not made part of PLplot labels.  Once these changes were
propagated to the rest of the front ends, this should hopefully make example
21 results uniform for all front-ends.

Coincidently, I was thinking about a RNG provided by the PLplot library. If nobody uses it except our example 21, no problem, since the code of RNGs is rather short, so no harm done here, and maybe some users find it useful though. A very good one (passed the diehard test), although maybe not good enough for encryption (don't think that will be a problem :), is the Mersenne Twister RNG

http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html

There is a C implementation available and the code is completely free. We could write a PLplot interface to this RNG, and then make the changes to all bindings. I volunteer to do that (that is the RNG interface, not all changes to the bindings), but only in two weeks, since I'm away for one week now.
I do not want to sound too critical, but do we need the Mersenne twister? It is a very nice thing, but wouldn't a linear congruential one do? We are not looking
for the ultimate in PRNGs, are we? :)

Here is a PRNG I picked up from Tcl (8.4):

   /*
    * Generate the random number using the linear congruential
    * generator defined by the following recurrence:
    *        seed = ( IA * seed ) mod IM
    * where IA is 16807 and IM is (2^31) - 1.  The recurrence maps
    * a seed in the range [1, IM - 1] to a new seed in that same range.
    * The recurrence maps IM to 0, and maps 0 back to 0, so those two
    * values must not be allowed as initial values of seed.
    *
    * In order to avoid potential problems with integer overflow, the
    * recurrence is implemented in terms of additional constants
    * IQ and IR such that
    *        IM = IA*IQ + IR
    * None of the operations in the implementation overflows a 32-bit
    * signed integer, and the C type long is guaranteed to be at least
    * 32 bits wide.
    *
    * For more details on how this algorithm works, refer to the following
    * papers:
    *
    *    S.K. Park & K.W. Miller, "Random number generators: good ones
    *    are hard to find," Comm ACM 31(10):1192-1201, Oct 1988
    *
    *    W.H. Press & S.A. Teukolsky, "Portable random number
    *    generators," Computers in Physics 6(5):522-524, Sep/Oct 1992.
    */

#define RAND_IA        16807
#define RAND_IM        2147483647
#define RAND_IQ        127773
#define RAND_IR        2836
#define RAND_MASK    123459876

   tmp = iPtr->randSeed/RAND_IQ;
   iPtr->randSeed = RAND_IA*(iPtr->randSeed - tmp*RAND_IQ) - RAND_IR*tmp;
   if (iPtr->randSeed < 0) {
   iPtr->randSeed += RAND_IM;
   }

(This is under BSD license)

Regards,

Arjen

-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://sourceforge.net/services/buy/index.php
_______________________________________________
Plplot-devel mailing list
Plplot-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/plplot-devel

Reply via email to