commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Gilles <gil...@harfang.homelinux.org>
Subject Re: [RNG] Generating for enums
Date Sat, 05 Aug 2017 18:37:36 GMT
On Sat, 5 Aug 2017 09:47:20 -0700, Gary Gregory wrote:
> On Fri, Aug 4, 2017 at 1:59 PM, Gilles <gilles@harfang.homelinux.org> 
> wrote:
>
>> Hi Gary.
>>
>> On Fri, 4 Aug 2017 11:10:57 -0700, Gary Gregory wrote:
>>
>>> For example, I have a enum like:
>>>
>>> public enum CardinalDirection (NORTH,SOUTH,EAST,WEST)
>>>
>>> and I want to say
>>>
>>> traveler.travel(nextRandomDirection());
>>>
>>> where
>>>
>>> public CardinalDirection nextRandomDirection() {
>>>    return rng.next(CardinalDirection.class);
>>> }
>>>
>>
>> Actually, "Commons RNG" already provides all the necessary 
>> functionality
>> for a one-liner:
>>
>> ---CUT---
>> import java.util.Arrays;
>> import org.apache.commons.rng.simple.RandomSource;
>> import org.apache.commons.rng.sampling.CollectionSampler;
>>
>> CollectionSampler<CardinalDirection> r
>>     = new 
>> CollectionSampler<>(RandomSource.create(RandomSource.SPLIT_
>> MIX_64),
>>                               
>> Arrays.asList(CardinalDirection.values()));
>>
>> CardinalDirection e = r.sample();
>> ---CUT---
>>
>
> Very nice, thank you.
>
> I can see a wrapper for this boilerplate though:
>
> public class RandomEnum<E> {
>
> private final Class<E> enumClass;
> private final CollectionSampler<CellDirection> rng;
>
> public RandomEnum(final Class<E> enumClass) {
> super();
> this.enumClass = enumClass;
> this.rng = new
> CollectionSampler<>(RandomSource.create(RandomSource.SPLIT_MIX_64),
> Arrays.asList(CellDirection.values()));
>
> }
>
> public CellDirection next() {
> return rng.sample();
> }
>
> @Override
> public String toString() {
> return "RandomEnum [rng=" + rng + ", enumClass=" + enumClass + "]";
> }
> }

I guess there is a mix of generics and "specifics" here (cf.
"CellDirection"). And if you have only have a generic "E" in
that class, you won't be able to call "E.values()".
Then see also my other post:
   http://markmail.org/message/h63yb7ozk4nyjagj

However, what does one gain with having to call this one-liner:
   RandomEnum<SomeEnum> r =
       new RandomEnum<SomeEnum>(SomeEnum.class,
                                
RandomSource.create(RandomSource.SPLIT_MIX_64));
vs the one I've suggested above?

Gilles

>> [...]

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


Mime
View raw message