none
La generación de números aleatorios con la función Random()

    Question

  • Hola, buenas tardes. Estoy intentando encontrar una respuesta al tema de la generación de números aleatorios mediante software asociado al reloj del ordenador. De hecho he mirado en Wikipedia y el artículo relativo a el tema de números aleatorios todavía está en discusión. En esa web dicen que un ordenador sólo genera números pseudo-aleatorios ( que en realidad dependen del ordenador) y se ha de tener especial cuidado en su uso. El problema que tengo es el siguiente: quiero tener una estructura de datos ordenada de forma aleatoria y me gustaría comprobar si el algoritmo es bueno utilizando un generador de números aleatorios para: 1) indicar el punto de corte del vector o de la base de datos, 2) otro número aleatorio que me diga cuántos elementos puedo mover a partir del punto de corte indicado por el valor aleatorio de 1) y 3) otro número aleatorio que me diga si tengo que colocar el bloque con un número de elementos indicado por el número aleatorio de 2) a la izquierda o a la derecha del punto de corte 1). ¿Será autenticamente aleatorio?. En caso de hacer este proceso un número determinado de veces, ¿podré conseguir una mezcla homogénea del grupo de elementos del vector o de la base de datos? y por último, ¿cómo podría comprobar que pudiera haber algún error en la generación de números aleatorios -por ejemplo una interrupción que bloqueara el hardware- para conseguir un algoritmo fiable?. Nota: dese luego las generaciones 1) 2) y 3) tendrían que tener en cuenta el tamaño limitado de la base de datos o del vector y también el caso de que cambie su tamaño.

    ¿Alguien sabe cómo se generan tablas de números aleatorios? En Estadística normalmente se tienen tablas de un número determinado de aleatorios que tienen que cumplir que su aparición sea idéntica en una reiteración muy elevada del proceso -es decir, que tienen que tener la misma probabilidad dentro de un rango porque en caso contrario el algoritmo no sería eficiente-?

    Son cosas que cuando estudias no las tienes en cuenta más que para el uso en la facultad. Después quizás alguien intenta entenderlo mejor.


    Antonio Prim Vidal

    Tuesday, March 20, 2012 7:43 PM

Answers

  • Pues no sé mucho del tema pero colaboro con lo poco que sé.

    Un número "aleatorio" generado por un algoritmo pseudo aleatorio nunca será aleatorio realmente, pero puede aproximarse si la semilla es realmente aleatoria y el algoritmo es suficientemente bueno y si la precisión del resultado es suficiente para minimizar o eliminar errores de redondeo.

    Hace años trabajé para una compañía de poker en línea muy famosa y el algoritmo que barajaba las cartas utilizaba un número pseudo aleatorio pero generado con una semilla realmente aleatoria compuesta de varias fuentes catalogadas como "white noise".  Por ejemplo, los programas cliente conectados a una mesa reportaban la posición del cursor en la pantalla en distintos momentos durante la partida.  Estos datos eran recolectados y agregados con otros datos como la hora del servidor y se generaba una semilla bastante grande, como de 1024 bits (128 bytes).  Según los cálculos de los estadísticos, esta semilla garantizaba que la posibilidad de repetirse una combinación de 52 cartas era más difícil que ganar la lotería.

    En fin, por ahí anda el asunto.


    Jose R. MCP

    Tuesday, March 20, 2012 11:04 PM
    Moderator
  • La función Random creo que utiliza Environment.TickCount como semilla para inicializar la generación de números aleatorios. De esta forma las siguientes sentencias serían equivalentes

    Random r1 = new Random();
    Random r2 = new Random(Environment.TickCount);

    El problema es que la creación de múltiples instancias en un espacio corto de tiempo nos darías generadores de números aleatorios que son iguales. La prueba en fácil de hacer y yo mismo lo he comprobado. Recienmente leí un post sobre la generación de números aleatorios y vi que se obtiene un mejor resultado usado usando la función GetHashCode sobre algún elemento que no dependa de la hora o del número de ticks del sistema. Más concretamente el autor afirmaba que la siguiente inicialización era mucho mejor

    Random random = new Random(Guid.NewGuid().GetHashCode());
    Espero que te sirva...


    Atentamente, Sergio.

    Wednesday, March 21, 2012 8:09 AM

All replies

  • Pues no sé mucho del tema pero colaboro con lo poco que sé.

    Un número "aleatorio" generado por un algoritmo pseudo aleatorio nunca será aleatorio realmente, pero puede aproximarse si la semilla es realmente aleatoria y el algoritmo es suficientemente bueno y si la precisión del resultado es suficiente para minimizar o eliminar errores de redondeo.

    Hace años trabajé para una compañía de poker en línea muy famosa y el algoritmo que barajaba las cartas utilizaba un número pseudo aleatorio pero generado con una semilla realmente aleatoria compuesta de varias fuentes catalogadas como "white noise".  Por ejemplo, los programas cliente conectados a una mesa reportaban la posición del cursor en la pantalla en distintos momentos durante la partida.  Estos datos eran recolectados y agregados con otros datos como la hora del servidor y se generaba una semilla bastante grande, como de 1024 bits (128 bytes).  Según los cálculos de los estadísticos, esta semilla garantizaba que la posibilidad de repetirse una combinación de 52 cartas era más difícil que ganar la lotería.

    En fin, por ahí anda el asunto.


    Jose R. MCP

    Tuesday, March 20, 2012 11:04 PM
    Moderator
  • La función Random creo que utiliza Environment.TickCount como semilla para inicializar la generación de números aleatorios. De esta forma las siguientes sentencias serían equivalentes

    Random r1 = new Random();
    Random r2 = new Random(Environment.TickCount);

    El problema es que la creación de múltiples instancias en un espacio corto de tiempo nos darías generadores de números aleatorios que son iguales. La prueba en fácil de hacer y yo mismo lo he comprobado. Recienmente leí un post sobre la generación de números aleatorios y vi que se obtiene un mejor resultado usado usando la función GetHashCode sobre algún elemento que no dependa de la hora o del número de ticks del sistema. Más concretamente el autor afirmaba que la siguiente inicialización era mucho mejor

    Random random = new Random(Guid.NewGuid().GetHashCode());
    Espero que te sirva...


    Atentamente, Sergio.

    Wednesday, March 21, 2012 8:09 AM