Il sito di Yahoo Answers verrà chiuso il 4 maggio 2021 (ora della costa est degli USA) e dal 20 aprile 2021 (ora della costa est degli USA) sarà in modalità di sola lettura. Non verranno apportate modifiche ad altre proprietà o servizi di Yahoo o al tuo account Yahoo. Puoi trovare maggiori informazioni sulla chiusura di Yahoo Answers e su come scaricare i tuoi dati in questa pagina di aiuto.

[C] Generare numero casuale?

Ciao

Come faccio a generare un numero casuale in C?

#include <stdio.h>

#include <stdlib.h>

main(){

int casuale;

srand(time(NULL));

casuale = rand() % 100;

printf("%d", casuale);

getch();

}

con queste istruzioni genera un numero in base all'orologio di sistema, il problema è che il risultato non è abbastanza casuale

in pratica il numero continua a crescere fino ad arrivare a 99 e poi ricomincia da 0

si vede il numero aumentare progressivamente e ripartire

Esiste qualche modo in C di generare un numero veramente casuale, che non dipenda da orologi e altre cose?

6 risposte

Classificazione
  • 1 decennio fa
    Risposta preferita

    Non ti sconvolgere, ma generare numeri VERAMENTE casuali non è possibile, semplicemente perché i computer sono matematici, e in matematica il caso non esiste. Questi generatori, infatti, si dicono pseudocasuali, perché generano numeri che rispettano determinate proprietà.

    Il fatto che i numeri ti sembrino poco casuali dipende dalla natura del generatore che usi e dall'uso che fai del generatore. Ti spiego meglio:

    la funzione rand() genera un numero x = (x' * a + c) % RAND_MAX, dove a, c e RAND_MAX sono costanti fisse, mentre x' è il numero precedentemente generato, o il seme, nel caso del primo numero.

    Dal momento che, ad ogni esecuzione del programma, generi sempre un solo numero, stai semplicemente generando il numero (time(NULL) * a + c) % RAND_MAX. Siccome esegui il programma ripetutamente, ad intervalli di pochi secondi, ottieni numeri consecutivi.

    Il modo più facile per ovviare al problema, mantenendo la pseudocasualità, è generare un numero "a vuoto":

    #include <stdio.h>

    #include <stdlib.h>

    main(){

    int casuale;

    srand(time(NULL));

    srand(rand()); //In questo modo generi un numero a vuoto

    casuale = rand() % 100;

    printf("%d", casuale);

    getch();

    }

    In alternativa, potresti utilizzare altre cose come input per la srand:

    -potresti scrivere il numero generato precedentemente in un file, e usarlo come seme per l'esecuzione successiva

    -puoi usare un dato più variabile nel tempo, se disponibile, come il tempo in millisecondi, piuttosto che in secondi.

    -puoi provocare tu stesso una variabilità nell'input, moltiplicando il tempo per un numero nell'ordine delle migliaia.

    Se vuoi una sequenza non dipendente dal tempo, devi utilizzare altri input non deterministici. Per esempio, il sito http://www.random.org/ genera numeri pseudocasuali utilizzando, come input, il rumore atmosferico captato con dei microfoni. Loro dicono che i loro numeri sono veramente casuali. In realtà, matematicamente, non lo sono, perché dipendono da qualcos'altro, cioè dal rumore che viene captato in quel momento. Un numero davvero casuale dovrebbe essere totalmente indipendente da tutto.

  • 1 decennio fa

    rand() è la funzione giusta; genera un numero intero compreso tra 0 e RAND_MAX (costante definita) in stdlib.h;

    srand cambia il seme: non dimenticare che i computer generano per forza numeri pseudocasuali (con algoritmi particolari parametrici, in cui il parametro è appunto il seme; a pari seme e pari algoritmo corrisponde la stessa *identica* sequenza "random"); dunque cambiando il seme ottieni sequenze pseudocasuali diverse ad ogni esecuzione.

    usare comunque % per limitare il range diminuisce la bontà della casualità, come lo stesso manuale di rand spiega; lì trovi accennato a come andrebbe invece fatto:

    http://linux.die.net/man/3/rand

    se ti servono generatori pseudocasuali più sofisticati, c'è sempre la GSL

    http://www.gnu.org/software/gsl/manual/html_node/R...

  • exProf
    Lv 7
    1 decennio fa

    Elimina la linea con srand.

  • 1 decennio fa

    int random (int n);

    con n intero, genera un numero da 0 a n-1.

    Ciao

    Fonte/i: libreria stdlib.h
  • Che ne pensi delle risposte? Puoi accedere per votare la risposta.
  • 1 decennio fa

    C'è la libreria stdlib.h con la funzione rand() % x (genera un numero minore di x)

    Vai su http://wwwold.iit.cnr.it/staff/paolo.santi/LabC/ra... per la spiegazione

  • 1 decennio fa

    se modifichi l'argomento di srand in srand(time(NULL) +(int)(&casuale+i)); e fai modificare i ad ogni ciclo i numeri sono decisamente + casuali se invece vuoi qualcosa di più tecnico e meno improvvisato puoi usare librerie apposite come Newran ( scaricabile da: http://www.robertnz.net/download.html e trovi la documentazione qui: http://www.robertnz.net/nr02doc.htm ) da includere

Altre domande? Fai una domanda e ottieni le risposte che cerchi.