On Jan 27, 1:33 pm, "Curtis A. Jones" <curtis_jo...@[EMAIL PROTECTED]
> wrote:
> Charles,
> Simply constructing an integer from the system clock to use as the
> seed {quadRL} for the random number generator may give a less than
> ideal sequence.
>
> James J. Weinkam discusses this in this comp.lang.apl group under
> "Random Number Generation in IP Sharp APL" (29 Jun 2006
1917)http://groups.google.com/group/comp.lang.apl/browse_frm/thread/33c60d...
>
> Among the consequences of a poor choice of seed:
> "Moreover choosing a seed which is nor relatively prime to the modulus
> causes the generator to produce a subsequence which is not of maximum
> length."
>
> One recommendation he makes:
> "...saving the value of the seed at the end or each run and using that
> value to seed the generator at the start of the next run."
Yes, I thought of that but would rather not decide on all the
housekeeping issues.
> I imagine you know this and have a function that selects only "valid
> values for {quadRL}" from the clock. Would you share it?
That's quite easy. The random number generation algorithm is
multiply by 5*7
reduce modulo (2*31)-1.
This algorithm generates every possible value before it repeats (I
checked the cycle length, which didn't take very long. In formal
language, the modulus is a prime and 5*7 is a primitive root, meaning
a number whose powers include every modulus class except 0. The fact
is that every prime does have primitive roots, so once you realize
that (2*31)-1 is a prime it follows that unless the implementor
blundered remarkably, the chosen multiplier must be a primitive root
and the generated numbers must be the full cycle. There was really no
need to check.)
That is, all numbers
0 < n < 2*31
are in the cycle, so start with any one of them. For example
1. Hash the system clock or whatever to a number. To ensure a valid
and efficient []RL
2. Reduce that number modulus (2*31)-2
3. Add 1.
Charles


|