TransWikia.com

Generar un número aleatorio en Java que se repita más veces que los demas, se puede con random?

Stack Overflow en español Asked by Selegna on February 2, 2021

Necesito generar números aleatorios de un rango de números [0-5], pero que **un número ** de este rango, se repita mas veces que todos los demás. Se puede realizar con random?

Por ejemplo que se repita el número 3 mas veces que cualquier otro número.

One Answer

Como indica @Rodrigo, una opción es crear un array con los elementos en la proporción que quieres. Haciendo una selección aleatoria uniforme (java.util.Random) se seleccionan los elementos de la lista con la misma probabilidad, por lo que, al haber elementos repetidos en la lista, aumenta la probabilidad de éstos.

Random random = new Random();
int[] elems = { ... };
int value = elems[random.nextInt(elems.length)];

random.nextInt(elems.length) te selecciona un número aleatorio de 0 a elems.length - 1, que se usa como índice para seleccionar un elemento del array.

Esto puede cumplir la función para casos simples pero, en general, es poco adecuado, tedioso y es necesario crear una lista muy larga para cuadrar probabilidades concretas.


Otra opción más sencilla y menos tosca es usar alguna librería como Apache Commons math library (maven, jar). La clase EnumeratedIntegerDistribution te permite indicar las probabilidades de cada elemento.

int[] values = { ... };
double[] probs = { ... };
        
EnumeratedIntegerDistribution dist = new EnumeratedIntegerDistribution(values, probs);
int value = dist.sample();

Ejemplo

public static void main(String[] args) {
    
    // APACHE COMMONS MATH
    // 0 = 20% | 1 = 10% | 2 = 5% | 3 = 40% | 4 = 15% | 5 = 10%
    int[] values =   {  0,   1,    2,   3,    4,   5};
    double[] probs = {0.2, 0.1, 0.05, 0.4, 0.15, 0.1};
    
    EnumeratedIntegerDistribution dist = new EnumeratedIntegerDistribution(values, probs);

    HashMap<Integer, Integer> counter = new HashMap<>();
    
    // Generación de 100 elementos
    for (int i = 0; i < 100; i++) {
        int value = dist.sample();
        counter.put(value, counter.getOrDefault(value, 0) + 1);
    }
    
    System.out.println(counter);
    // {0=21, 1=8, 2=6, 3=42, 4=19, 5=4}  Los resultados variarán de una ejecución a otra
    
    
    // ------------------------------------------------
    
    // RANDOM
    HashMap<Integer, Integer> counter2 = new HashMap<>();
    
    Random random = new Random();
    int[] elems = {0,0,0,1,1,2,2,2,2,3};    // 0 = 30% | 1 = 20% | 2 = 40%, 3 = 10%
    for (int i = 0; i < 100; i++) {
        int value = elems[random.nextInt(elems.length)];
        counter2.put(value, counter2.getOrDefault(value, 0) + 1);
    }
    System.out.println(counter2);
    // {0=38, 1=20, 2=32, 3=10}
    
}

Answered by Barrendeitor on February 2, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP