¿Cómo genero números aleatorios sin la función rand()?

4 minutos de lectura

¿Como genero numeros aleatorios sin la funcion rand
AnkurVj

Quiero generar (pseudo) números aleatorios entre 0 y algún número entero. No me importa si no son demasiado aleatorios. Tengo acceso a la hora actual del día pero no a la función rand. ¿Alguien puede pensar en una forma suficientemente robusta para generarlos? ¿Quizás, descartando algunos bits de la hora del día y tomando módulo mi número entero o algo así?

estoy usando c

  • Esto suena a tarea. Si es así, debe etiquetarlo con la etiqueta “tarea”.

    –Josh Darnell

    29 de septiembre de 2011 a las 20:19


  • Si tiene acceso a google.com, intente buscar esto: “generador de números aleatorios”.

    – DWB

    29 de septiembre de 2011 a las 20:19

  • ¿Por qué no simplemente leer de /dev/random? O utilice el método xkcd.

    usuario142019

    29 de septiembre de 2011 a las 20:21


  • ¿Qué le impide simplemente usar random() ¿luego?

    – Staven

    29 de septiembre de 2011 a las 20:24

  • rand() generalmente se implementa de manera muy simple (usando una simple multiplicación de la semilla y luego una mezcla) … generalmente se trata de una línea. Solo búscalo en Google.

    – Caja de jabón

    29 sep 2011 a las 20:40

Si está buscando un generador pseudoaleatorio ultra simple, puede usar un Registro de cambio de retroalimentación lineal.

El artículo de wikipedia tiene algunos fragmentos de código para que los mires, pero básicamente el código para un generador de 16 bits se verá así (ligeramente masajeado desde esa página…)

  unsigned short lfsr = 0xACE1u;
  unsigned bit;

  unsigned rand()
  {
    bit  = ((lfsr >> 0) ^ (lfsr >> 2) ^ (lfsr >> 3) ^ (lfsr >> 5) ) & 1;
    return lfsr =  (lfsr >> 1) | (bit << 15);
  }

  • ¡Exactamente lo que necesitaba! una solución muy simple y elegante

    – AnkurVj

    29/09/2011 a las 21:51

  • Esto funciona. Solo necesita cambiar el lfsr cuando necesite un flujo de números diferente

    – dilan sachi

    15 de mayo de 2020 a las 8:41

¿Como genero numeros aleatorios sin la funcion rand
dennis

Para números enteros “no demasiado aleatorios”, puede comenzar con la hora actual de UNIX y luego usar la fórmula recursiva r = ((r * 7621) + 1) % 32768;. El n-ésimo entero aleatorio entre 0 (incluido) y M (exclusivo) sería r % M después de la n-ésima iteración.

Esto se llama un generador lineal congruente.

La fórmula de recursión es lo que bzip2 utiliza para seleccionar el pivote en su implementación de clasificación rápida. No sé sobre otros propósitos, pero funciona bastante bien para este en particular…

Mire la implementación de un generador pseudoaleatorio (lo que está “dentro” rand()) por su cuenta, por ejemplo, el Tornado de Mersenne es muy apreciado.

La única forma “robusta” (no fácilmente predecible) de hacer esto es escribir su propio generador de números pseudoaleatorios y sembrarlo con la hora actual. Enlace de wikipedia obligatorio: http://en.wikipedia.org/wiki/Pseudorandom_number_generator

1647553447 207 ¿Como genero numeros aleatorios sin la funcion rand
Rajan Saha Raju

#include <chrono>

int get_rand(int lo, int hi) {
    auto moment = std::chrono::steady_clock::now().time_since_epoch().count();
    int num = moment % (hi - lo + 1);
    return num + lo;
}

  • Parece una respuesta de C++ a una pregunta de C.

    – BoR

    16 de enero a las 12:33

Puedes conseguir el “Tiny Mersenne Twister” aquí: http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/TINYMT/index.html

es puro c y fácil de usar. Por ejemplo, simplemente usando el tiempo:

#include "tinymt32.h"
// And if you can't link:
#include "tinymt32.c"

#include <time.h>
#include <stdio.h>

int main(int argc, const char* argv[])
{
    tinymt32_t state;
    uint32_t seed = time(0);

    tinymt32_init(&state, seed);

    for (int i=0; i<10; i++)
            printf("random number %d: %u\n", i, (unsigned int)tinymt32_generate_uint32(&state));
}

  • Parece una respuesta de C++ a una pregunta de C.

    – BoR

    16 de enero a las 12:33

1647553448 62 ¿Como genero numeros aleatorios sin la funcion rand
HaseeB Mir

El más pequeño y sencillo. generador aleatorio que trabajan con rangos se proporciona a continuación con un ejemplo completamente funcional.

unsigned int MyRand(unsigned int start_range,unsigned int end_range)
  {
    static unsigned int rand = 0xACE1U; /* Any nonzero start state will work. */

    /*check for valid range.*/
    if(start_range == end_range) {
        return start_range;
    }

    /*get the random in end-range.*/
    rand += 0x3AD;
    rand %= end_range;

    /*get the random in start-range.*/
    while(rand < start_range){
        rand = rand + end_range - start_range;
    }

    return rand;
  }

int main(void)
{
    int i;
    for (i = 0; i < 0xFF; i++)
    {
    printf("%u\t",MyRand(10,20));
    }
    return 0;
}

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad