Java - Problema con una probabilidad inversamente proporcional a un parámetro

 
Vista:
Imágen de perfil de José Miguel

Problema con una probabilidad inversamente proporcional a un parámetro

Publicado por José Miguel (2 intervenciones) el 22/09/2023 21:20:10
Básicamente:
-Tengo un atributo int MAX_USES = 5;
-Me piden hacer un método boolean discardElement(int usesLeft), en el que, cuanto más cerca esté usesLeft de MAX_USES, menos probabilidad hay de devolver true.
-Por lo tanto, si usesLeft = 5, 100% se devolverá false, mientras que si usesLeft = 0, 100% se devolverá true.

-¿Cómo aplico este método?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Problema con una probabilidad inversamente proporcional a un parámetro

Publicado por Kabuto (1383 intervenciones) el 23/09/2023 13:17:27
Se me ocurre que podemos crear un array con por ejemplo 50 booleans. Inicialmente todos tienen valor FALSE.
Luego calculamos la diferencia entre MAX_USES y usesLeft para decidir cuántos TRUE vamos a introducir en el array

Por ejemplo, si MAX_USES es 5 y usesLeft es 4, la diferencia es 1. Lo multiplicamos por 10, y así sabemos cuantos TRUES hay que introducir, en este caso, serían 10.
Así el array tendría 40 FALSE y 10 TRUE
Por último, retornamos una posición al azar de ese array. Como hay 4 veces más FALSE que TRUE, la probabilidad de obtener FALSE es mayor

Por contra, si MAX_USES es 5 y usesLeft es 1, la diferencia es 4, y por tanto habría que introducir 40 TRUES en el array.

Así, al elegir uno al azar, tendremos 10 FALSE y 40 TRUE, por tanto la probabilidad de obtener TRUE es mayor.


Esa cantidad de TRUES que tenemos que introducir en el array, también las colocaremos en posiciones aleatorias, para favorecer que todo sea resultado del azar

Dejo este código rápido de ejemplo, creo que con los comentarios se entiende el proceso lógico que se ha seguido.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import java.util.Random;
 
public class Main {
 
	private static final int MAX_USES = 5;
	private static Random rnd = new Random();
 
	private static boolean discardElement(int usesLeft) {
		if (usesLeft == 0)
			return true;
		else if (usesLeft == 5)
			return false;
		else {
			boolean[] odds = new boolean[50];//Inicia con 50 falses
			int numTrues = (MAX_USES - usesLeft) * 10;//Calculamos cuantos trues tendrá el array.
			/*
			 * Introducimos en el array, en posiciones aleatorias, la cantidad de trues calculada.
			 */
			while (numTrues > 0) {
				//Obtenemos posicion aleatoria.
				int pos = rnd.nextInt(50);
				//Comprobamos valor de esa posicion
				if (odds[pos] == false) { //Solo actuamos si el valor actual es falso
					odds[pos] = true; //Introducimos true
					numTrues--; //Queda un true menos por introducir
				}
			}
 
			//Array confeccionado. Elegimos un resultado al azar
			return odds[rnd.nextInt(50)];
		}
	}
 
 
	public static void main(String[] args) {
 
		int usesLeft = 5;
 
		while(usesLeft >= 0) {
			System.out.println("Intentos restantes: " + usesLeft);
			System.out.println("Resultado devuelto: " + discardElement(usesLeft));
			System.out.println("\t*****************");
			usesLeft--;
		}
 
		System.out.println("\n\t\tFIN DE PROGRAMA");
	}
 
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Josemi

Problema con una probabilidad inversamente proporcional a un parámetro

Publicado por Josemi (2 intervenciones) el 23/09/2023 17:35:20
Muchas gracias, y buenísimas respuesta.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar