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
Post a Comment