I'm having trouble with Javas Random
class, if i do this:
Random rng = new Random(seed) // seed == 29 in this example
String ss = "";
for(int i = 0; i < 10; i++)
{
int s = rng.nextInt();
ss += Integer.toString(s);
ss +="\n";
}
This is what i get back:
-1169335537
-2076183625
1478047223
1914482305
722089687
2094672350
-1234724057
-1614953544
-321574001
1000360613
From what I have read this should only be returning positive numbers for a start?
This may be a bit far fetched but it couldnt have anything to do with running a 64 bit machine on Windows 7 64 bit?
Any help at all would be awesome need to get this finished for an assignment hand in today!
You also can use Math.random() which returns values between 0 and 1
Per the documentation http://download.oracle.com/javase/6/docs/api/java/util/Random.html#nextInt():
Returns the next pseudorandom, uniformly distributed int value from this random number generator's sequence. The general contract of nextInt is that one int value is pseudorandomly generated and returned. All 2^32 possible int values are produced with (approximately) equal probability.
Just multiply by -1 if the value is negative
This will have a bound of 0 to 29.
Since there is an equal chance of positive or negative numbers why not just:
Nice and easy!
If you happen to work with numbers that have the possibility of having a negative value you can turn it into a positive value using a conditional declaration automatically by multiplying the value to a negative one. You can also turn a positive into a negative value using this same method.
The examples are below.
From the Java docs for
nextInt()
:One approach is to use the following transform:
The reason something like this is needed (as opposed to using absolute value or negation) is that
Integer.MIN_VALUE
is too large in absolute value to be turned into a positive integer. That is, due to overflow,Math.abs(Integer.MIN_VALUE) == Integer.MIN_VALUE
andInteger.MIN_VALUE == -Integer.MIN_VALUE
. The above transformation preserves the approximately uniform distribution property: if you wrote a generate-and-test loop that just threw awayInteger.MIN_VALUE
and returned the absolute value of everything else, then the positive integers would be twice as likely as zero. By mappingInteger.MIN_VALUE
to zero, that brings the probability of zero into line with the positive integers.Here is another approach, which may actually be a tiny bit faster (although I haven't benchmarked it):
This will generate an integer with 31 random low-order bits (and 0 as the 32nd bit, guaranteeing a non-negative value). However (as pointed out in the comment by jjb), since
next(int)
is aprotected
method ofRandom
, you'll have to subclassRandom
to expose the method (or to provide a suitable proxy for the method):Another approach is to use a
ByteBuffer
that wraps a 4-byte array. You can then generate a random four bytes (by callingnextBytes(byte[])
), zero out the sign bit, and then read the value as anint
. I don't believe this offers any advantage over the above, but I thought I'd just throw it out there. It's basically the same as my first solution (that masks withInteger.MAX_VALUE
).In an earlier version of this answer, I suggested using:
However, according to the docs this will generate integers in the range 0 (inclusive) to
Integer.MAX_VALUE
(exclusive). In other words, it won't generate the valueInteger.MAX_VALUE
. In addition, it turns out thatnext(int)
is always going to be faster thannextInt(int)
.