
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
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);
}

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

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;
}
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));
}

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;
}
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