Algoritmi e Codice c++ per i numeri casuali

La gestione dei numeri casuali è prevista in tutti i linguaggi di programmazione ad alto livello com il C++, e quindi nell’algoritmo è possibile prevedere una funzione chiamata “Casuale” che ha come argomento un numero intero positivo. Il generatore estrae i numeri compresi nell’intervallo [0,n-1] ove n è il numero intero positivo passato come argomento alla funzione “Casuale”. Anche nel software fliwgirutgn esiste tale funzione che ha nome “Random” e la cui sintassi è Random(n) ove n è il limite superiore dell’insieme dei numeri casuali da generare da 0 a n-1. Nel linguaggio C++ per la generazione dei numeri casuali occorre utilizzare le liobreire <cstdlib> per le funzioni “srand” e “rand” e la libreria <timle.h> o <ctime> per la gestione del tempo.
Infatti i numeri casuali sono generati attraverso dei processi casuali sul computer o tramite il metodo “Monte Carlo” che è un argomento avanzato di statistica. Impropriamente sono numeri casuali, infatti sarebbe più corretto chiamarli numeri “pseudo-casuali” in quanto il loro processo di generazione è comunque guidato dal programma informatico.
Nel linguaggio C++ è necessario inizializzare il generatore di numeri casuali con l’istruzione:

srand(time(NULL));

che indica al calcolatore di inizializzare il generatore con un “seme” per una sequenza arbitraria di numeri pseudo-casuali. Infatti il codice sopra indica il numero di secondi trascorsi fra 1 Gennaio 1970 e la data corrente all’avvio del programma. Se il seme viene fissato genera sempre la stessa sequenza.
Provare questo codice sotto riportato che genera due sequenze di distinte di numeri casuali fra 1 e MAXINT del C++ di un unsigned int.

  GNU nano 6.2                         es1.cpp                                  
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{       cout << "Tempo:" << time(NULL) <<endl;
        srand(time(NULL));
        for (int k=0;k<2;k++)
        {       cout << "\nSequenza : "<< k+1 << endl;
                for (int i=0;i<4;i++)
                                cout << "\nNumero casuale:"<< rand() << "\t";
        }
        cout << endl;   
        return 0;
}

Il codice riportato imposta due volte la squenz adi numeri casuali attraverso due cicli for che provvedono a stampare due sequenze di numeri casuali distinte di 4 numeri.
Per generare dei numeri in un intervallo preciso è possibile utilizzare la funzione rand() con l’espressione:

rand() %(b-a1+)+a;

genera nel caso di b>a numeri casuali nell’intervallo [a,b].

L’esercizio proposto:

Un giocatore punta una somma di x euro sull’estrazione di un numero intero compreso fra 1 e 90. La vincita di tale partita è determinata da questo tabella Estrazione Vincita Numero esatto 100 volte la puntata Numero Estratto – Numero puntato < 10 10 volte la puntata Numero Estratto – Numero puntato > =10 e < 50 5 volte la puntata Numero Estratto – Numero puntato > 50 Nessuna vincita (Numero Estratto – Numero puntato )/2 è pari 3 volte la puntata Scrivi un algoritmo, un programma che letto il numero da puntare, estratto un numero casuale fra 1 e 90 e la relativa puntata determini se il giocatore ha vinto e quanto eventualmente ha vinto.

L’algoritmo risolutivo prevede il seguente flow chart:

Pseudo-codice dell'algoritmo:

Funzione Inizio
    Dichiara x, t: Reale
    Dichiara n, e, d: Intero

    Assegna t = 0
    Assegna d = 0
    Scrivi "Quanti soldi scommetti:"
    Leggi x
    Scrivi "inserisci il numero scelto: da 1 a 90:"
    Leggi n
    Assegna e = Random(90)+1
    Assegna d = Abs(e-n)
    Se d==0
        Assegna t = 100*x
    Fine
    Se d<10
        Assegna t = 10*x
    Fine
    Se (d>=10 && d<50)
        Assegna t = 5*x
    Fine
    Se d % 2 ==0
        Assegna t = t+3*x
    Fine
    Se t>0
        Scrivi "il numero estratto è:"&e
        Scrivi "l'importo vinto è:"&t
    Altro
        Scrivi "il numero estratto è:"&e
        Scrivi "Non hai vinto !"
    Fine
Fine

Questo è l’algoritmo risolutivo che richiede anche la funzione “Abs” per calcolare il valore assoluto della differenza fra il numero estratto e il numero puntato. In quanto tale differenza può essere negativa nel caso in cui il numero estratto sia inferiore a quello giocato. La differenza può valere zero che indica che il giocatore ha indovinato il numero.
La codifica C++ è:

#include <iostream>
#include <time.h>
#include <cstdlib>
#include <math.h>
using namespace  std;
int main()
{
    float x,t;
    int e,n,d;
    t=0;
    d=0;
    cout << "\n Inserisci importo da scommettere:";
    cin >> x;
    cout << "\n Numero da giocare:";
    cin >> n;
    srand(time(NULL));
    e=rand() % 90+1;
    d=abs(e-n);
    if (d==0)
        t=100*x;
    if (d<10)
        t=10*x;
    if (d>=10 && d<50)
        t=5*x;
    if (d % 2 ==0)
        t=t+3*x;
    if (t>0)
    {
        cout << "\n Hain vinto:";
        cout << "\n un importo pari a:"<< t << endl;
        cout <<"\n Il numero estratto è:"<< e << endl;
    }
    else{
        cout << "\n Non hai vinto !";
        cout <<"\n Il numero estratto è:"<< e << endl;
    }
    return 0;
} 

A conclusione il

Video completo dell’esercitazione


In questa pagina sono presenti link di affiliazione che garantiscono a questo sito una piccola quota di ricavi, senza variazione del prezzo per l’acquirente.