Генерация целых чисел с шансом

Генерация целых чисел с шансом


Я задался вопросом: как сделать рандомайзер целых чисел, но с шансом. То есть есть диапазон от 0 до 100 и цифры целые. Но хотелось бы сделать так, что бы шанс выпадения какого-то числа был 20%

Ответ:

Вообразим массив (Отсортированный), где: number - числа, а chance - их количество в массиве

import java.util.Random;
import java.util.stream.IntStream;

public class Test {

    public static void main(String[] a) {

        int[] number = new int[] {0, 1,  23, 456, 7890, 12345}; // Числа
        int[] chance = new int[] {0, 50, 1, 1,    1,    10   }; // Количество

        int count = IntStream.of(chance).sum(); // Считаем количество элементов воображаемого массива

        // Вывод вероятностей:
        for (int i = 0; i < chance.length; i++) {
            System.out.println("Вероятность числа \"" + number[i] + "\":  \t" + (chance[i]*100d/count) + "%");
        }
        
        // Генерация случайного числа
        Random random = new Random();
        for (int randomNumsCount = 0; randomNumsCount < 10; randomNumsCount++) {
            
            int index = random.nextInt(count); // Выбираем случайный индекс из воображаемого массива

            for (int i = 0; i < chance.length; i++) { // Ищем элемент, которому принадлежит этот индекс
                index -= chance[i];
                if(index < 0) {
                    System.out.println("Случайное число: " + number[i]);
                    break;
                }
            }

        }
    }
}

Примеры массивов:

Число 10 - 50%

Число 100 - 50%

int[] number = new int[] {10, 100};
int[] chance = new int[] {50, 50};  // или new int[] {1, 1} или new int[] {25, 25} 

Воображаемый массив: {10, 25}


Число 15 - 20%

Число 20 - 30%

Число 25 - 50%

int[] number = new int[] {15, 20, 25};
int[] chance = new int[] {2,  3,  5};  // или new int[] {20, 30, 50} ...


Воображаемый массив: {15,15, 20,20,20, 25,25,25,25,25}



Report Page