Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [C] Come funzionano i numeri casuali?

    Il seguente programma serve ad indovinare il numero casuale che genera il computer
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
    int numero_casuale;
    int c;
    do
           {
           printf("\n Pensa ad un numero da 0 a 100 [0 per uscire]: ");
           scanf(" %d", &c);
           fflush(stdin);
           numero_casuale=random()%100;
           if ( c == numero_casuale ) printf("Bravo! Il numero pensato è %d", numero_casuale);
           else printf(" Spiacente, riprova! Il numero è %d",numero_casuale);
           }
    while(c!=0);
    
    return 0;
    }
    Vorrei sapere in che modo vengono generati i numeri casuali? Esiste un'array che qualcuno ha inserito nel processore?
    Grazie

  2. #2
    No, in genere è un banale generatore lineare congruenziale, nel caso della random di glibc la spiegazione nel dettaglio si trova qui. In ogni caso non sono veri numeri casuali, è semplicemente una successione generata da un algoritmo a partire da un certo valore iniziale (seed).

    Per inciso, la random non è standard, dovresti usare la rand invece; inoltre nel tuo codice non inizializzi il seed del generatore di numeri casuali, per cui ad ogni avvio del programma riottieni la stessa sequenza di numeri casuali (derivante dal seed di default 1). Per evitare questo inconveniente, in genere si usa come seed il tempo corrente (ottenuto tramite time(NULL)).

    Il tuo programma dovrà quindi essere:
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    int main(void)
    {
        int numero_casuale;
        int c;
        srand(time(NULL));
        do
        {
           printf("\n Pensa ad un numero da 0 a 100 [0 per uscire]: ");
           scanf(" %d", &c);
           fflush(stdin);
           numero_casuale=rand()%100;
           if ( c == numero_casuale ) printf("Bravo! Il numero pensato è %d", numero_casuale);
           else printf(" Spiacente, riprova! Il numero è %d",numero_casuale);
        } while(c!=0);
        return 0;
    }
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    In realtà non è un vero e proprio numero casuale. Cioè per generare un numero casuale una CPU dovrebbe generare un numero casuale per generare un numero casuale, e questo all'infinito, perchè ovviamente una CPU non può "non sapere" quello che fà e fare una cosa "casualmente".

    Per questo motivo credo abbia un numero stabilito (perchè non lo può generare casualmente, deve sempre avere un numero base) e su di esso faccia delle operazioni secondo un algoritmo, che lo renda il più "diverso" possibile da quello di partenza.
    lolide
    Java Programmer

    Informati

  4. #4
    Perfetto è quello che volevo sapere, non è un numero casuale ma un algoritmo specifico che genera dei numeri.
    Grazie a tutti e due.

  5. #5
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2020 vBulletin Solutions, Inc. All rights reserved.