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