How do I pick a random number within a range, but weighted relative to one part of that range? (in Java)

I want to select random numbers in a range of numbers, but heavier than a portion of that range. For example:

  • Pick a random number between 1-10
  • Weight so that 1-5 can be 20% more than 6-10

Is it possible? How should I do it?


source to share

4 answers

It depends on how you want your probability distribution to look.

For example:

Pick a random number between 1-10
If it is <= 6
    Return a random number between 1-5
    Return a random number between 6-10


Picks a number at 1-5 60% of the time and a number at 6-10 40% of the time.



Roll and add multiple cubes to form a bell-shaped probability curve. Then subtract the average. Repeat roll if negative. The more cubes roll, the more it weighs.

Here's one path, completely untested.

float sum;
do {
   sum = rollThreeDice(); // returns 3 to 18, with an average is 10.5
   sum -= 10.5;           // Now the range is 0 to 7.5, with the lower end being more likely.
   } while(sum < 0);
return sum;


Of course, you can roll the dice on any number of sides to get the range you want. You control the frequency curve by choosing the number of bones.



Two solutions come to mind. First, do an arbitrary case twice:

java.utils.Random randomGenerator = new java.utils.Random();
int random = randomGenerator.nextInt(11);
if(random <= 6) { //This is 20% more
    random = randomGenerator.nextInt(5) + 1;
} else {
    random = randomGenerator.nextInt(5) + 6;


Or, if you always have a static range, you can fill the array with digits by adding more numbers you want more and pick a random value along the length of the array.



Try the following:

public int weightedRandom() {
  int rand = Math.floor(Math.random() * 5 + 1) // From 1 to 5
  if (Math.random() >= 0.6) {
  return rand;




All Articles