On 12/27/15 6:51 AM, Gilles wrote:
> On Sun, 27 Dec 2015 12:48:08 +0100, Gilles wrote:
>> Hi.
>>
>>>> [...]
>>>> BitStreamGenerator uses the more standard int next(int bits). 
>>>> Note
>>>> that we have *no* internal direct implementations of
>>>> AbstractRandomGenerator, while BitStreamGenerator has worked very
>>>> nicely as a root for good PRNGs.
>>>
>>> Something implicit in "BitStreamGenerator": the maximum number of
>>> bits is 32 (cf. return type of "next(int)" and the ubiquitous use
>>> of hard-coded "32".
>>>
>>> What about the possibility of using a "long" as a building block
>>> for another family of RNG?
>>>
>>> Gilles
>>>
>>>>
>>>> Therefore, I think for V4 it might actually be best to just drop
>>>> AbstractRandomGenerator.  Sorry I did not think of this before
>>>> responding above.
>>>>
>>>> Phil
>>
>> (1)
>> Do all RNG that are going to ever be implemented in CM based on a
>> "int next(int)" method?
>>
>> If not, then we can have a problem as soon as there is another
>> way to provide the random bits.
>>
>> (2)
>> Assuming that we only need
>>   int next(int bits)
>>
>> I notice that the source of random bits does indeed creates an
>> "int",
>> say "x", and then truncates it before returning:
>>
>>   protected int next(int bits) {
>>     // Build "x"...
>>     return x >>> 32 - bits;
>>   }
>>
>> So, I believe that the actual basis for generating randomness
>> should be
>> a "public abstract int nextInt()" method to be overridden by
>> concrete
>> RNG producers (as "next(int)" currently is):
>>
>>   @Override
>>   public int nextInt() {
>>     // Build "x"...
>>     return x;
>>   }
>>
>> and the truncation should be performed inside the respective
>> methods that
>> currently call "next(int)". [Which are all in
>> "BitsStreamGenerator".]
>> For example: replace the current
>>
>>   public float nextFloat() {
>>     return next(23) * 0x1.0p-23f;
>>   }
>>
>> by
>>
>>   public float nextFloat() {
>>     return (nextInt() >>> 9) * 0x1.0p-23f;
>>   }
>>
>> And, as a bonus, this will avoid the unnecessary
>>   x >>> (32 - 32)
>> operation currently performed when calling "next(32)".
>>
>> OK?
>>
>> If so, I propose to still create a new "BaseRandomGenerator"
>> class that will
>> be different from "BitsStreamGenerator" because of the above
>> changes.
>>
>> This class should be backported to MATH_3_X so that we can deprecate
>> "BitsStreamGenerator" in 3.6.
>>
>
> In addition to points (1) and (2) above, we should discuss the
> following one.
>
> (3)
> Deprecate the "setSeed" methods (and also remove them from the
> "RandomGenerator" interface).

-1

The RandomGenerator interface is extracted from Random. As such, it
provides a simple way to plug in a [math]-supplied PRNG where Random
is used in code.  Dropping this method will force a lot of needless
refactoring.  The setSeed method exists as a convenience for users. 
As one of those users, I don't want to see it go away.

Phil
> The rationale is that they typically provide information for a
> constructor;
> they invalidate the previous state of the instance and imply the same
> computation as is performed at construction.
> [The only task not repeated by "setSeed" is the array(s) allocation.]
>
> I thus propose that we use the fluent API, as we agreed to do in
> general,
> for the RNGs too. [I.e. a method "withSeed" will create a new
> instance.]
>
> This will also solve the potential security problem of having
> public methods
> called from the constructor.
>
> Any objection?
>
> Gilles
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
> For additional commands, e-mail: dev-h...@commons.apache.org
>
>


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org

Reply via email to