Returning a random even number
I have the following methods. The method rnd, returns a single random integer between two bounds:
开发者_开发问答 /* Create next batch of 55 random numbers */
void advance_random (){
int j1;
double new_random;
for(j1=0; j1<24; j1++){
new_random = oldrand[j1]-oldrand[j1+31];
if(new_random<0.0){
new_random = new_random+1.0;
}
oldrand[j1] = new_random;
}
for(j1=24; j1<55; j1++){
new_random = oldrand[j1]-oldrand[j1-24];
if(new_random<0.0){
new_random = new_random+1.0;
}
oldrand[j1] = new_random;
}
} //advance_ramdom
/* Fetch a single random number between 0.0 and 1.0 */
double randomperc(){
jrand++;
if(jrand>=55){
jrand = 1;
advance_random();
}
return((double)oldrand[jrand]);
} //randomPerc
/* Fetch a single random integer between low and high including the bounds */
synchronized int rnd (int low, int high){
int res;
if (low >= high){
res = low;
} else {
res = low + (int)(randomperc()*(high-low+1));
if (res > high){
res = high;
}
}
return (res);
} // rnd
How do I modify this so that the number returned mod2 =0?
Thanks
if you can get a random number in range [a, b]
then all you have to do is get a random number in the range [(a+1)/2, b/2]
and multiply it by 2 to get a random even number in range [a, b]
Use a bit-mask to force the least-significant bit to be zero:
x = x & ~1;
Multiply the result you get from your code by two at the end - still random, and divisble by 2!
how about using:
return res & ~1;
In Java 1.7 or later, I would use ThreadLocalRandom:
import java.util.concurrent.ThreadLocalRandom;
// Get even random number within range [min, max]
// Start with an even minimum and add random even number from the remaining range
public static int randEvenInt(int min, int max) {
if (min % 2 != 0) ++min;
return min + 2*ThreadLocalRandom.current().nextInt((max-min)/2+1);
}
// Get odd random number within range [min, max]
// Start with an odd minimum and add random even number from the remaining range
public static int randOddInt(int min, int max) {
if (min % 2 == 0) ++min;
return min + 2*ThreadLocalRandom.current().nextInt((max-min)/2+1);
}
The reason to use ThreadLocalRandom is explained here. Also note, that the reason we +1 to the input to ThreadLocalRandom.nextInt() is to make sure the max is included in the range.
精彩评论