Java Random giving negative numbers -


i'm having trouble javas random class, if this:

random rng = new random(seed) // seed == 29 in example  string ss = "";         for(int = 0; < 10; i++)         {             int s = rng.nextint();             ss += integer.tostring(s);             ss +="\n";         } 

this back:

-1169335537 -2076183625 1478047223 1914482305 722089687 2094672350 -1234724057 -1614953544 -321574001 1000360613 

from have read should returning positive numbers start?

this may bit far fetched couldnt have running 64 bit machine on windows 7 64 bit?

any @ awesome need finished assignment hand in today!

from java docs nextint():

all 232 possible int values produced (approximately) equal probability.

one approach use following transform:

private static final int mask = (-1) >>> 1; // ones except sign bit  public int nextnonnegative() {     return rng.nextint() & mask; // 0 out sign bit } 

the reason needed (as opposed using absolute value or negation) integer.min_value large in absolute value turned positive integer. is, due overflow, math.abs(integer.min_value) == integer.min_value , integer.min_value == -integer.min_value. above transformation preserves approximately uniform distribution property: if wrote generate-and-test loop threw away integer.min_value , returned absolute value of else, positive integers twice zero. mapping integer.min_value zero, brings probability of 0 line positive integers.

here approach, may tiny bit faster (although haven't benchmarked it):

int s = rng.next(integer.size - 1); // integer.size == 32 

this generate integer 31 random low-order bits (and 0 32nd bit, guaranteeing non-negative value). (as pointed out in comment jjb), since next(int) protected method of random, you'll have subclass random expose method (or provide suitable proxy method):

public class myrandom extends random {     public myrandom() {}     public myrandom(int seed) { super(seed); }      public int nextnonnegative() {         return next(integer.size - 1);     } } 

another approach use bytebuffer wraps 4-byte array. can generate random 4 bytes (by calling nextbytes(byte[])), 0 out sign bit, , read value int. don't believe offers advantage on above, thought i'd throw out there. it's same first solution (that uses mask).

in earlier version of answer, suggested using:

int s = rng.nextint(integer.max_value); 

however, according the docs generate integers in range 0 (inclusive) integer.max_value (exclusive). in other words, won't generate value integer.max_value. in addition, turns out next(int) going faster nextint(int).


Comments