commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Gilles (JIRA)" <>
Subject [jira] [Updated] (MATH-1341) "RandomDataGenerator" is brittle
Date Fri, 13 May 2016 13:27:12 GMT


Gilles updated MATH-1341:

I attached a new {{RandomUtils}} class which I propose as a replacement for {{RandomDataGenerator}}.

Having removed all methods that are _trivial_ syntactic sugar for the sampler API in {{o.a.c.m.distribution}},
the number of lines in {{RandomUtils}} is ~60% of the old {{RandomDataGenerator}}.

The "nextSecureXxx" methods were also removed as most were identical to their "non-secure"
counterpart, except for the underlying RNG (secure vs not). In {{RandomUtils}}, secure versions
are thus "automatically" achieved by passing a secure RNG to the class's constructor.

Methods {{nextHexString}} and {{nextSecureHexString}} were different in that the latter uses
a {{MessageDigest}} object in its processing.
The two codes were merged in a single method and a boolean argument selects one or the other

{{RandomUtils}} also obsoletes class {{RandomGeneratorFactory}} whose functionality is replaced
by the following factory method:
public static UniformRandomProvider asUniformRandomProvider(final Random rng) {
  // ....

Old "features" intentionally left out:
* Lazy initialization (if you don't need the RNG, you don't need an instance of this class)
* Reseeding of the RNG (if necessary - although a bad idea - the caller can hold a reference
to the {{Random}} object being wrapped, and call "setSeed" on it)

Please have a look, and let me know of any functionality I may have missed to port to the
new class.

> "RandomDataGenerator" is brittle
> --------------------------------
>                 Key: MATH-1341
>                 URL:
>             Project: Commons Math
>          Issue Type: Bug
>            Reporter: Gilles
>            Priority: Minor
>              Labels: API, cleanup, deprecation, thread-safety
>             Fix For: 4.0
>         Attachments:
> Class {{RandomDataGenerator}} can easily be misused as it advertizes a method to access
its internal RNG (which is _not_ thread-safe).
> The class is also a mixed bag of "data generators" that are either "secure" or not.
> Moreover it uses the "lazy initialization" pattern (for the RNG instance) solely because
of this duality; otherwise users that need one or the other form of data generation will obviously
always use the RNG since all data generation methods need it.
> This entails also a performance hit (albeit tiny) as each call checks whether the RNG
has been initialized already.
> The clean solution would be to separate the two types of data generation (secure vs not)
into different classes.

This message was sent by Atlassian JIRA

View raw message