Números random en Java

Aedra

He hecho este código para generar un número random entre 2 números dados con Java:

static int getRandomInt ( int min, int max){
                    return (int) (Math.round(Math.random() * (max - min))+ min);
                }

Nota: El Math.round lo he metido porque el Math.random da un número entre el 0 y el 0.9999999(...), por lo que al pasarlo a entero se me quedaba en 9 el valor más alto y por tanto nunca me salía el número max.

He hecho varias pruebas y funciona, ya que el objetivo es que no dé ningún número por debajo del mínimo o por encima del máximo.

Ahora bien, lo que me mosquea un poco es que he lanzado 4 veces el programa pidiendo 10.000 números cada vez con esto

for (int i=0 ; i<10000 ; i++){

        System.out.println(getRandomInt(1,10));
    }

y el resultado es el siguiente

Como podéis ver, los números intermedios mantienen un % de aparición bastante constante e igualado, pero los números de los extremos (el 1 y el 10) aparecen aproximadamente la mitad de veces que el resto, por lo cual no estoy dando ni siquiera una aleatoriedad aproximada y no sé si es un problema de mi código o del comando Math.random.

El programa que uso es IntelliJ IDEA Ultimate y el lenguaje es Java.

Gracias! :)

Tony_Toscana

Mirando así un poco por encima creo que el problema va a ser el redondeo.

Si estás pidiendo números entre el 1 y el 10 y los estás redondeando, nos quedaría algo así:

En el rango [1, 1.5), devolvería 1.
En el rango [1.5, 2.5), devolvería 2.
...
En el rango [8.5, 9.5), devolvería 9.
Y en el rango [9.5, 10), devolvería 10.

Haciendo efectivamente, que los números del 2 al 9, tengan el doble de posibilidades de aparecer que el 1 y el 10.

2 respuestas
Aedra

#2 ostras pues tiene mucho sentido. ¿Cómo se puede hacer entonces para crear un código aleatorio sin este error?

1 respuesta
Tony_Toscana

#3 En lugar de redondear, trunca el número.

1 respuesta
Aedra

#4 si trunco me pasa lo mismo que sin poner el Math.round y es que en el resultado del Math.random desde después del 0.9 hasta antes del 1 pierdo esos decimales y por tanto nunca se da el número max

cabron

creo que no entiendes como funcionan los números aleatorios, aquí tienes una explicación rápida:

¿hay algún motivo por el que no uses java.util.Random ?

1 2 respuestas
Aedra

#6 jaja esa es buena

Pues me acabo de enterar de que existe el java.util.Random la verdad, voy a investigar, gracias :)

Lecherito

+1 al Random (venia a ponerlo) que ya esta implementado. Ademas tienes los metodos nextInt que te dan todo lo que necesitas y se supone que esta bien distribuido.

Como consejo, si estas en un IDE puedes empezar a escribir lo que necesitas y en la mayoria de casos ya encontraras una clase que lo hace.

1 respuesta
Aedra

#8 acabo de hacer una prueba y así me da bastante decente

static int getRandomInt ( int min, int max){
                    return (int) (Math.random()*(max-min+1)+min);

El nextInt para qué? :/
Recuerdo que soy muy n00b jaja

1 respuesta
Lecherito

#9 Sep, pero para que estas usando la variable random ahi? Esas son las cosas que pueden pasar cuando se hacen a mano! A no ser que necesites algo muy personalizado intenta usar algo estandarizado como es el Random!

1 respuesta
Aedra

#10 mierda ya lo he editado xD
Se me había quedado colgada esa variable de un experimento que estaba trasteando jaja

1 respuesta
Lecherito

#11 Sep, ese mismo metodo con random (https://docs.oracle.com/javase/8/docs/api/java/util/Random.html#nextInt-int-) seria algo del estilo:

static int getRandomInt ( int min, int max){
                    return new java.util.Random().nextInt(max) + min;
}

Y en verdad no hace falta que crees uno cada vez, etc. Pero bueno, asi como lo tienes esta bien.

1 respuesta
Aedra

#12 Pues muchas gracias!

Y también a #2 y #6 :D

JuAn4k4

Si quieres una distribución que se ajuste a la realidad, mirate Benfords Law, deberías tener un 30% de 1s, y un 20% de 2s.

https://es.m.wikipedia.org/wiki/Ley_de_Benford

1 respuesta
Lecherito

#14 Cabron si esta aprendiendo Java y le metes leyes de probabilidad/estadistica xDDDDDDDD

4

Usuarios habituales

  • Lecherito
  • JuAn4k4
  • Aedra
  • cabron
  • Tony_Toscana