We know that the classic range random function is like this:
public static final int random(final int min, final int max) {
Random rand = new Random();
return min + rand.nextInt(max - min + 1); // +1 for including the max
}
I want to create algorithm function for generating number randomly at range between 1..10, but with uneven possibilities like:
1) 1,2,3 -> 3/6 (1/2)
2) 4,5,6,7 -> 1/6
3) 8,9,10 -> 2/6 (1/3)
Above means the function has 1/2 chance to return number between 1 and 3, 1/6 chance to return number between 4 and 7, and 1/3 chance to return number between 8 and 10.
Anyone know the algorithm?
UPDATE:
Actually the range between 1..10 is just served as an example. The function that I want to create would apply for any range of numbers, such as: 1..10000, but the rule is still same: 3/6 for top range (30% portion), 1/6 for middle range (next 40% portion), and 2/6 for bottom range (last 30% portion).
Use the algorithm:
int temp = random(0,5);
if (temp <= 2) {
return random(1,3);
} else if (temp <= 3) {
return random(4,7);
} else {
return random(8,10);
}
This should do the trick.
EDIT: As requested in your comment:
int first_lo = 1, first_hi = 3000; // 1/2 chance to choose a number in [first_lo, first_hi]
int second_lo = 3001, second_hi = 7000; // 1/6 chance to choose a number in [second_lo, second_hi]
int third_lo = 7001, third_hi = 10000;// 1/3 chance to choose a number in [third_lo, third_hi]
int second
int temp = random(0,5);
if (temp <= 2) {
return random(first_lo,first_hi);
} else if (temp <= 3) {
return random(second_lo,second_hi);
} else {
return random(third_lo,third_hi);
}
You can fill an array of the desired numbers with the desired density, and then generate a random index and take the corresponding element. I think it is faster a bit, but propably it is not so important. Something like that, it's not the correct solution, just an example:
1,1,1,2,2,2,3,3,3,4,5,6 ...
Or you can define domains first with if statements, and then generate a simple number from that domain.
int x = random(1,6)
if (x < 4) return random(1, 3);
if (x < 5) return random(4, 7);
return random(8, 10);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With