Foro de elhacker.net

Programación => Java => Mensaje iniciado por: pedro_75 en 25 Noviembre 2014, 23:50 pm



Título: Duda Numeros aletorios de la loteria.
Publicado por: pedro_75 en 25 Noviembre 2014, 23:50 pm
Hola buenas tardes.

En principio quiero hacer un programa que genere los numeros aletorios de la superonce, les explicare en que consiste.

El Super Once es un juego de lotería de la ONCE formado por una matriz de 80 números, numerados del 1 al 80, y consiste en elegir entre 5 y 11 números de la matriz siendo su orden indiferente.

Previa celebración de un sorteo se obtendrá una combinación ganadora formada por 20 números de los 80.

Una apuesta está integrada por una combinación de números de entre las aceptadas en el producto más el precio pagado para dicha combinación. Existen 7 tipos de apuestas en función de la cantidad de números elegidos, 11, 10, 9, 8, 7, 6 ó 5. Con estos elementos se podrá optar a los premios que correspondan, en función del al tipo de apuesta, el importe en euros apostado y el número de aciertos obtenidos.

(http://www.euromillon.net/superonce/img/premio-por-apuesta.png)


A continuación, les explicare mis dudas y planteamiento de como hacerlo

1 Los numeros estan divididos estan divididos en 8 Filas en la primera Fila esta en el rango del 1 al 10, la segunda fila del 11 al 20... Para hacer esto tengo pensando en un bucle for, con 8 variables (1 cada fila), en el se genera un numero aletorio y pasarle el valor a la variable segun el valor del incremento.

Me explico de una manera mas sencilla, Tengo 8 variables cada una representa la cantidad de numeros que habrá y pasariamos el valor generado a cada variable es decir si tenemos la variable fila1 le pasaremos el primer valor generado, el segundo valor genereda se lo pasamos a la variable fila2 asi sucesivamente hasta la octava variable.

2 Ya descrito la cantidad de numeros en cada fila, es hora de crear los numeros mi pensamiento es crear 8 bucles for y se paren con el valor de la fila, si en la primera fila es 3 se generaran 3 numeros del 1 al 10.

2.1 El programa puede generar numeros repetidos ¿ Como es posible solucionarlo?

Este es un ejemplo con una sola Fila.

Código
  1. /**
  2.  *
  3.  * @author pedro_75
  4.  */
  5.  
  6.  
  7. class numerosaletorios {
  8.  
  9. public static void main(String[] args) {
  10.  
  11.        double rango;
  12.        int numeroentero,Fila1=3;    // Este valor lo he escogido yo pero en el programa  habra un bucle que nos generara los
  13.                                                 // valores de las filas
  14.  
  15.  
  16. for (int i=0; i<Fila1; i++){
  17.  
  18.          rango = (Math.random()*(10)+1);
  19.          numeroentero = (int) rango; // en nuestro programa solo nos interesan los numeros enteros no decimales                                      
  20.          System.out.println(numeroentero);
  21.  
  22.        }
  23.    }
  24. }
  25.  

3 Existe una base de datos, con los resultados de la superonce como podria hacer un metodo o clase en el que recogiera esos datos comprobara uno por uno las posibilidades de que pueda salir.




4 Con mis estatidisticas y posibilidades,  ¿como puedo modificar la clase Random para que pueda salir mas por ejemplo el 2 que el 5 segun las posibilidades?









Título: Re: Duda Numeros aletorios de la loteria.
Publicado por: Saberuneko en 27 Noviembre 2014, 18:13 pm
Hmm... respondiéndote a las partes 1 y 2.

Te recomendaría trabajar con arrays.

A la hora de generar números, verifica si hay duplicados recorriendo el array antes de añadir el nuevo valor.

No tires de variables del tipo fila1, fila2, fila3... En vez de eso hazte un array fila[posición] y recórrelo con un único bucle for que te rellene el array de una tirada.

Similar a esto:
Código
  1. int fila[7];
  2. Random rand = new Random();
  3. for(int i=0; i<fila.size(); i++)
  4. {
  5. ...
  6. fila[i] = (rand.nextInt((10)+1));
  7. ...
  8. }

Para comprobar duplicados, algo del palo:
Código
  1. public boolean comprobarDuplicados(int valor)
  2. {
  3. duplicado=false;
  4. for(int i=0; i<fila.size(); i++)
  5. {
  6. if(fila[i]==valor)
  7. duplicado=true;
  8. }
  9. return duplicado;
  10. }

ALTERNATIVAMENTE, y mucho más práctico, utiliza un HashSet. (No admiten duplicados).

HashSet (Java Platform SE7):
https://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html


Sobre la parte 4, yo suelo hacerlo "extendiendo" el random con condicionales y valores más altos.

Por ejemplo, generamos valores del 0 al 9, pero me interesa que salga más el 9, por decir algo.
Pasos que yo seguiría:

1.- Generar un aleatorio de 0 a 100.
2.- Asignar una parte proporcional de probabilidad a cada número con condicionales.
2.1.- Las condicionales asignarán el valor adecuado.

Ejemplo:

Quiero un 20% de posibilidades para un 9, el resto con probabilidades normales.
Si el valor aleatorio me sale entre 81 y 100, asigno el 9.
Los otros valores se reparten el resto de forma equitativa. (Approx 8).

Código
  1. if(value >= 81 && value < 100)
  2.   value = 9;
  3. else
  4.   value = value/9

Así salen más nueves que otros números.


Título: Re: Duda Numeros aletorios de la loteria.
Publicado por: pedro_75 en 4 Diciembre 2014, 13:00 pm
Gracias por responderme saburenko, me has solucionado muchas dudas que tenia! me pondre a ello enseguida