metodo - obtener numeros aleatorios sin repetir java




Genera números aleatorios sin usar ninguna función externa (6)

¿ System.currentTimeMillis() cuenta como externo? Siempre se puede obtener esto y calcular mod por algún valor máximo:

int rand = (int)(System.currentTimeMillis()%high)+low;

Estas fueron las preguntas formuladas en una de las entrevistas a las que asistí recientemente.

Por lo que sé, un número aleatorio entre dos números se puede generar de la siguiente manera

public static int rand(int low, int high) {
    return low + (int)(Math.random() * (high - low + 1));
}

Pero aquí estoy usando Math.random () para generar un número aleatorio entre 0 y 1 y usar eso para ayudarme a generar entre bajo y alto. ¿Hay alguna otra manera que pueda hacer directamente sin usar funciones externas?


Aquí estoy sugiriendo que algunas fuentes con comentarios pueden ser de utilidad:

  • Tiempo del sistema : Monotónico en un día pobre al azar. Rápido, fácil.
  • Punto del mouse : Aleatorio Pero no es útil en un sistema independiente.
  • Zócalo sin formato / Red local (parte de información del paquete): buena aleatoria Técnica y tiempo: es posible modelar un modo de ataque para reducir la aleatoriedad.
  • Algún texto de entrada con permutación : Rápido, común y bueno también (en mi opinión).
  • Sincronización de la interrupción debido al teclado, la unidad de disco y otros eventos: Común: error propenso si no se usa con cuidado.
  • Otro enfoque es alimentar una señal de ruido analógica : ejemplo como temp.
  • Datos del archivo /proc : en el sistema Linux. Siento que deberías usar esto.

    /proc/sys/kernel/random: este directorio contiene varios parámetros que controlan la operación del archivo /dev/random .

    Los archivos especiales de caracteres /dev/random y /dev/urandom (presentes desde Linux 1.3.30 ) proporcionan una interfaz para el generador de números aleatorios del kernel.

    Intente estos commads:

    $cat /dev/urandom   

    y

    $cat /dev/random

    Puede escribir una función de lectura de archivo que lea de este archivo.

    Leer (también sugiere): ¿Es seguro un rand de / dev / urandom para una clave de inicio de sesión?

`


Los generadores de números pseudoaleatorios típicos calculan nuevos números basados ​​en los anteriores, por lo que en teoría son completamente deterministas. La única aleatoriedad se garantiza al proporcionar una buena semilla (inicialización del algoritmo de generación de números aleatorios). Mientras que los números aleatorios no sean muy críticos para la seguridad (esto requeriría números aleatorios "reales"), un generador de números aleatorios recursivo de este tipo satisface las necesidades.

La generación recursiva se puede expresar sin ninguna función "externa", una vez que se proporcionó una semilla. Hay un par de algoritmos para resolver este problema. Un buen ejemplo es el generador lineal congruente .

Una implementación de pseudocódigo podría parecerse a la siguiente:

long a = 25214903917;   // These Values for a and c are the actual values found
long c = 11;            // in the implementation of java.util.Random(), see link
long previous = 0;

void rseed(long seed) {
    previous = seed;
}

long rand() {
    long r = a * previous + c;
    // Note: typically, one chooses only a couple of bits of this value, see link
    previous = r;
    return r;
}

Aún necesita sembrar este generador con algún valor inicial. Esto se puede hacer haciendo uno de los siguientes:

  • Usar algo como la hora actual (bueno en la mayoría de los casos que no son críticos para la seguridad, como los juegos)
  • Uso de ruido de hardware (bueno para la aleatoriedad de seguridad crítica)
  • Usando un número constante (bueno para la depuración, ya que siempre obtienes la misma secuencia)
  • Si no puede usar ninguna función y no quiere usar una semilla constante, y si está usando un lenguaje que lo permite, también podría usar algo de memoria no inicializada. En C y C ++, por ejemplo, defina una nueva variable, no le asigne algo y use su valor para generar el generador. Pero tenga en cuenta que esto está lejos de ser una "buena semilla" y solo un truco para cumplir con sus requisitos. Nunca uses esto en código real.

Tenga en cuenta que no existe un algoritmo que pueda generar diferentes valores para diferentes ejecuciones con las mismas entradas sin acceso a algunas fuentes externas como el entorno del sistema. Cada generador de números aleatorios bien sembrados hace uso de algunas fuentes externas.


Podría obtener la hora actual del sistema, pero eso también requeriría una función en la mayoría de los idiomas.


Puede obtener casi aleatoriedad (en realidad caótica y definitivamente no es uniforme *) del mapa logístico x = 4x(1-x) comenzando con una "no racional" x entre 0 y 1 .

La "aleatoriedad" aparece debido a los errores de redondeo en el borde de la precisión de la representación de punto flotante.

(*) Puedes deshacer el sesgo una vez que sepas que está ahí.


Puede usar la dirección de una variable o combinar la dirección de más variables para hacer una más compleja ...







data-structures