Charles Brenner wrote:
> 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
You are missing the point.
It is true in the present instance that any non zero value less than
2*31 is a valid seed; but if you simply choose a new seed at random
there is a risk that you will simply be generating the same stream of
random numbers you used in a previous experiment shifted by a bit. This
can lead to undesirable correlation between runs which can invalidate
subsequent statistical analysis.
Saving {quad}RL at the end of a run and restoring it at the beginning of
the next is hardly a major housekeeping issue.


|