Dave Whipp wrote:
> 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.
I agree, even though I'm only a semi serious user of RNG.
> 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.
I don't think they should. If you want that, use confuse a RNG with a
sequence generator that it is not.
> 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 { ... };"
I'd say
1) A RNG class (don't really care what the name is, for now)
2) An instance of that in $*RAND (which you can temp())
3) rand() and srand() act on $*RAND
4) It should be easy to create instances of the RNG to use in your own
class.
Would that make sense to you?
Moritz