2013-07-24 2 views
12
#include <stdio.h> 
#include <stdlib.h> 

int main() 

{ 
    int randomnumber; 
    randomnumber = rand() % 10; 
    printf("%d\n", randomnumber); 
    return 0; 
} 

Questo è un programma semplice in cui RandomNumber è una variabile int inizializzata che è destinata ad essere stampato come un numero casuale compreso tra 1 e 10. Tuttavia, esso stampa sempre lo stesso numero ogni volta che corro all'infinito. Qualcuno può aiutarmi e dirmi perché questo sta accadendo? Grazie.generare un numero casuale compreso tra 1 e 10 in c

+6

Leggi su [ 'srand()'] (http: // it. cppreference.com/w/c/numeric/random/srand). – jxh

+2

Probabilmente hai pregiudizi in quella selezione. – chris

+2

@chris: Sì, ma il pregiudizio in questo caso è abbastanza minore; dato che 'RAND_MAX' è almeno 32767, il bias è inferiore a una parte su 3000, e se hai bisogno di numeri pseudocasuali di qualità migliore di quello dovresti probabilmente usare qualcosa di meglio di' rand() '. Tuttavia, probabilmente vale la pena indirizzarsi, specialmente se si desidera un intervallo più ampio (vicino a 'RAND_MAX'). La domanda 13.16 delle [domande frequenti comp.lang.c (http://www.c-faq.com/) mostra come eseguire questa operazione. –

risposta

13

È necessario un seme diverso ad ogni esecuzione.

Si può iniziare a chiamare all'inizio del vostro programma:

srand(time(NULL)); 

Nota che % 10 produce un risultato 0-9 e non 1-10: basta aggiungere 1 al vostro % espressione per ottenere 1 a 10.

+0

grazie ma quando aggiungo srand (time (NULL)); subito dopo dichiaro la variabile randomnumber, il compilatore mi dà l'errore che la conversione implicita perde la precisione dell'intero: 'time_t (aka' long ') a' unsigned int ' – Nisarg

+1

@Nisarg; Usa 'srand ((unsigned) time (NULL))'. 'srand()' accetta un valore 'unsigned' come argomento. – haccks

+0

@Nisarg è possibile ignorare tranquillamente questo messaggio o trasmettere l'argomento della funzione a 'unsigned int' per disattivarlo. – ouah

1

devi inizializzare il generatore di numeri casuali, da man 3 rand

Se non viene fornito alcun valore di inizializzazione, la funzione rand() è seminato automaticamente con un valore di 1.

e

La funzione srand() imposta il suo argomento come seme per una nuova sequenza di numeri pseudo-casuali da restituire da rand(). Queste sequenze sono ripetibili chiamando srand() con lo stesso valore di inizializzazione.

ad es.

srand(time(NULL)); 
+0

grazie per la spiegazione! – Nisarg

0

Generare un singolo numero casuale in un programma è problematico. I generatori di numeri casuali sono solo "casuali" nel senso che le ripetute invocazioni producono numeri da una data distribuzione di probabilità.

Seminare il RNG non è di aiuto, soprattutto se lo si semina da un timer a bassa risoluzione. Riceverai solo numeri che sono una funzione hash dell'ora e, se chiami spesso il programma, potrebbero non cambiare spesso. Potresti migliorare un po 'usando srand(time(NULL) + getpid()) (_getpid() su Windows), ma ciò non sarà casuale.

L'unico modo per ottenere numeri che sono casuali attraverso invocazioni multiple di un programma è quello di ottenere dal di fuori del programma. Ciò significa utilizzare un servizio di sistema come /dev/random (Linux) o CryptGenRandom() (Windows) o un servizio come random.org.

+0

grazie, fai sapere come utilizzare un servizio di sistema per ottenere un generatore di numeri casuali legit su un MAC? Cordiali saluti: sto usando Xcode. – Nisarg

+0

Non sono un Mac, ma credo che siano abbastanza simili a Unix che hanno un '/ dev/random' o'/dev/urandom'. –

+0

nessun problema, sottovoce. Grazie. – Nisarg

0

Ecco un pronto per l'esecuzione di codice sorgente per il generatore di numeri casuali utilizzando c preso da questo sito: http://www.random-number.com/random-number-c/ . L'implementazione qui è più generale (una funzione che prende 3 parametri: min, max e il numero di numeri casuali per generare)

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

// the random function 
void RandomNumberGenerator(const int nMin, const int nMax, const int nNumOfNumsToGenerate) 
{ 
    int nRandonNumber = 0; 
    for (int i = 0; i < nNumOfNumsToGenerate; i++) 
    { 
    nRandonNumber = rand()%(nMax-nMin) + nMin; 
    printf("%d ", nRandonNumber); 
    } 
    printf("\n"); 
} 

void main() 
{ 
    srand(time(NULL)); 
    RandomNumberGenerator(1,70,5); 
} 
0
srand(time(NULL)); 

int nRandonNumber = rand()%((nMax+1)-nMin) + nMin; 
printf("%d\n",nRandonNumber);