2011-09-29 11 views
18

Voglio generare (pseudo) numeri casuali tra 0 e alcuni interi. Non mi importa se non sono troppo casuali. Ho accesso all'ora corrente del giorno ma non alla funzione rand. Qualcuno può pensare a un modo sufficientemente robusto per generare questi? Forse, scartando alcuni bit dall'ora del giorno e prendendo modulo il mio intero o qualcosa del genere?Come posso generare numeri casuali senza funzione rand()?

Sto usando c.

+2

Questo suona come i compiti. Se lo è, dovresti taggarlo con il tag "compiti a casa". – jadarnel27

+0

Se si ha accesso a google.com, provare a cercare questo: "generatore di numeri casuali". – DwB

+2

Perché non leggere semplicemente da '/ dev/random'? Oppure usa il metodo xkcd. –

risposta

19

Se siete alla ricerca di un ultra-semplice generatore pseudo-casuale, si può semplicemente utilizzare un Linear Feedback shift Register.

L'articolo di Wikipedia ha alcuni frammenti di codice per voi a guardare, ma in fondo il codice per un generatore a 16 bit sarà simile a questa (leggermente massaggiato da quella pagina ...)

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

Esattamente quello di cui avevo bisogno! una soluzione molto semplice ed elegante – AnkurVj

7

Cerca di implementare un generatore pseudo-casuale (cosa c'è "dentro" rand()) di tuo, ad esempio lo Mersenne twister è molto apprezzato.

0

è possibile ottenere il "Piccolo Mersenne Twister" qui: http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/TINYMT/index.html

è pura c e semplice da usare. Per esempio. usando solo il tempo:

#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

Non posso usare alcuna libreria aggiuntiva! – AnkurVj

+0

Cosa intendi con non può? che ne dici di includere un altro #include "tinymt32.c"? – Dominic

7

Per numeri interi "non troppo casuali", è possibile iniziare con l'ora UNIX corrente, quindi utilizzare la formula ricorsiva r = ((r * 7621) + 1) % 32768;. L'ennesimo numero casuale compreso tra 0 (incluso) e M (esclusivo) sarà r % M dopo l'ennesima iterazione.

Questo è chiamato generatore di congruenza lineare.

La formula di ricorsione è ciò che bzip2 utilizza per selezionare il pivot nella sua implementazione quicksort. Io non so di altri scopi, ma funziona abbastanza bene per questo particolare ...

-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

Puoi portare una spiegazione per il tuo codice per favore! E per favore leggi [come scrivere una buona risposta] (http://stackoverflow.com/help/how-to-answer) – eliasah

-1

Qui di seguito il programma generato numeri casuali, senza l'utilizzo di rand fuction

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

} 

Forse è utile

-1

Uno dei più semplici generatore di numeri casuali, che non restituisce allways lo stesso valore:

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

È possibile avere il tempo di impostare il valore iniziale se non si desidera che la sequenza inizi sempre con lo stesso valore.

+0

Qualcuno può spiegare il voto negativo? – 12431234123412341234123

Problemi correlati