masak wrote:
Modified:
   docs/Perl6/Spec/S32-setting-library/Numeric.pod
Log:
[S32/Numeric] removed method form of srand

Overwhelming consent on #perl6 about this.

- multi method srand ( Real $seed: )
  multi srand ( Real $seed = default_seed_algorithm())
Seed the generator C<rand> uses. C<$seed> defaults to some combination

I think that most serious users of random numbers (that includes me) would generally agree that it would be foolish to use the builtin RNG in most languages -- looks like Perl6 would be included in that list. I was wondering if something could be done to at least make the abstraction usable.

There are two main issues: the generator algorithm, and the scope of the generator.

The issue of selecting an algorithm with sufficiently good statistical properties could be addressed simply by allowing a closure/iterator to be passed to srand to set the actual RNG algorithm, not just the seed. That should be fairly simple to implement.

For my work, the more interesting issue is scope of the RNG. This breaks down into a couple of issues:

1. do all implementations of Perl6 generate the same sequence, given the same initial seed. If the initial "seed" were a closure then of course this question becomes irrelevant. So I'd be tempted to allow closures, and then leave the default RNG as implementation-defined.

2. seed stability across multiple "generators":

2a. If I spawn two threads (implicitly or explicitly), how do their RNGs interact? I.e. are C<rand> and C<pick> thread-safe?

2.b If I create multiple classes/objects, each of which generates a stream of random traffic (a common need generating random tests), can I change the implementation of one of those classes without affecting the traffic generated by the others. The standard way to deal with this is to have a distinct random generator per-object. To have that as the default behavior of Perl6 would probably be too expensive. That said, it would be nice if there were a way to define the scope/multiplicity of the internal RNG so that functions like C<pick> could be used within such a traffic generator scenario.

I think that all that is needed is to permit some sort of declaration/pragma that creates a dynamic scope for an srand: e.g. "temp srand { ... };"

Reply via email to