2011-09-29 18 views
18

Quiero generar números (pseudo) aleatorios entre 0 y algunos enteros. 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 generar estos? Quizás, descartando algunos bits de la hora del día y tomando el módulo de mi entero o algo así?¿Cómo puedo generar números aleatorios sin la función rand()?

Estoy usando c.

+2

Esto suena como la tarea. Si es así, debe etiquetarlo con la etiqueta "tarea". – jadarnel27

+0

Si tiene acceso a google.com, trate de buscar esto: "generador de números aleatorios". – DwB

+2

¿Por qué no simplemente leer de '/ dev/random'? O usa el método xkcd. –

Respuesta

19

Si lo que busca es un generador de ultra-sencilla pseudo-aleatorio, sólo se puede utilizar un Linear Feedback shift Register.

artículo de Wikipedia tiene algunos fragmentos de código para que usted pueda ver, pero básicamente el código de un generador de 16 bits se verá algo como esto (la ligera masajeado de 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); 
    } 
+0

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

7

Considere la implementación de un generador pseudoaleatorio (lo que está "dentro" rand()) propio, por ejemplo, el Mersenne twister es muy apreciado.

0

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

es pura C y fácil de usar. P.ej. 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)); 
} 
+0

¡No puedo usar ninguna biblioteca adicional! – AnkurVj

+0

¿Qué quiere decir con can not? ¿qué hay de incluir otro #include "tinymt32.c"? – Dominic

7

Para enteros "no demasiado al azar", que podrían comenzar con el actual tiempo de UNIX, a continuación, utilizar la fórmula recursiva r = ((r * 7621) + 1) % 32768;. El enésimo entero aleatorio entre 0 (inclusive) y M (exclusivo) sería r % M después de la enésima iteración.

Esto se denomina generador congruente lineal.

La fórmula de recursión es lo que bzip2 utiliza para seleccionar el pivote en su implementación de quicksort. Yo no sé acerca de otros fines, pero funciona bastante bien para éste en particular ...

-2
#include<stdio.h> 
#include<conio.h> 
#include<stdlib.h> 
int main() 
{ 
unsigned int x,r,i; 
// no of random no you want to generate 
scanf("%d",&x); 
// put the range of random no 
scanf("%d",&r); 
unsigned int *a=(unsigned int*)malloc(sizeof(unsigned int)*x); 
for(i=0;i<x;i++) 
printf("%d ",(a[i]%r)+1); 
free(a); 
getch(); 
return 0; 
} 
+0

¿Puede traer una explicación para su código por favor! Y lea acerca de [cómo escribir una buena respuesta] (http://stackoverflow.com/help/how-to-answer) – eliasah

-1

A continuación el programa genera números aleatorios, sin necesidad de utilizar fuction rand

#include<stdio.h> 
#include<time.h> 
int main() 
{ 
    int num; 
    time_t sec; 
    sec=time(NULL); 
    printf("Enter The Number\n"); 
    scanf("%d",&num); 
    if(num>0) 
    { 
     for(;;) 
     { 
      sec=sec%3600; 
      if(num>=sec) 
      { 
      printf("%ld\n",sec); 
      break; 
      } 
      sec=sec%num; 
     } 
    } 
    else 
    { 
     printf("Please Enter Positive Value\n\n\n*****Thanks For Visit*****\n\n\n"); 
    } 
    return 0; 

} 

Puede ser que es útil

-1

Uno de los más simple generador de números aleatorios, que no vuelve Allways el mismo valor:

uint16_t simpleRand(void) 
    { 
    static uint16_t r = 5531; //dont realy care about start value 
    r+=941; //this value must be relative prime to 2^16, so we use all values 
    return r; 
    } 

Quizás pueda obtener el tiempo para establecer el valor inicial si no desea que la secuencia comience siempre con el mismo valor.

+0

¿Puede alguien explicar el voto negativo? – 12431234123412341234123

Cuestiones relacionadas