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