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.
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();
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
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP