Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
Guida Pascal - Appendice 4 Numeri a caso

Guida Pascal

Capitolo 23° - Appendice 4 Numeri a caso

<< Precedente Prossimo >>
Può capitare diverse volte di aver bisogno di generare numeri casuali:

program rnd_sim;
uses crt;
var x,ir:integer;
    rr:real;

begin
    clrscr;
    writeln('Inserisci un numero intero: ');
    readln(x);
    (*Comunica all'elaboratore di tenersi pronto per la generazione
    di numeri casuali*)
    randomize;
    (*Ottiene un numero intero casuale fra 0 e x (estremi inclusi) con la
    funzione random e lo deposita in ir*)
    ir:=random(x+1);
    (*Ottiene un numero a tre cifre decimali tra 0 e 1 con la funzione
    random e lo deposita in rr*)
    rr:=random;
    writeln('Numero intero casuale fra 0 e ',x,': ',ir);
    writeln('Numero reale casuale (tre cifre decimali) fra 0 e 1: ',rr:4:3);
    readln
end.


La procedura randomize comunica al computer di tenersi pronto per la generazione di numeri casuali. E obbligatorio prima di ogni chiamata a random().
La funzione random(x:word) restituisce un valore scelto a caso nellintervallo 0..x-1 (estremi inclusi), dove x è un numero intero. Se non si specifica un numero tra parentesi, viene scelto un numero casuale da 0 a 1, con tre cifre decimali, così:

randomize;
m:=random;

Quindi, quando si vogliono generare numeri casuali, si usa la sintassi:
(*...*)
Randomize;
(*...*)
<variabile>:=Random(<range>);


Vediamo ora un caso, più complesso, in cui per esempio si vuole estrarre a sorte i partecipanti ad un torneo:

program sel_cas;
uses crt;
var nome:array[0..300] of string[50];
    scelto,index,i:word;
    abbinamenti,volte:word;
    s:string;

begin
    clrscr;
    index:=0; (*Setta index a 0*)
    repeat    (*inizia un ciclo repeat...until*)
    write('Inserire il nome del partecipante: ');
    readln(nome[index]);  (*legge il nome*)
    index:=index+1;       (*e incrememnta index di uno*)
    until nome[index-1]=''; (*finchè il nome immesso è uguale ad una stringa vuota*)
    clrscr;
    write('Abbina 2 partecipanti alla volta, per   volte.');
    gotoxy(39,1); (*sposta il cursore tra per e volte*)
    read(volte);  (*legge il numero di combinazioni da fare*)
    randomize;    (*inizializza la randomizzazione*)
    for i:=1 to volte do (*per volte volte*)
      begin
      abbinamenti:=random(index-1); (*sceglie un numero a caso*)
      write(i,'- ',nome[abbinamenti],' con ');(*e scrive il nome*)
      abbinamenti:=random(index-1);           (*corrispondente*)
      writeln(nome[abbinamenti],'.');         (*2 volte*)
      end;
    readln; (*aspetta pressioni del pulsante invio*)
    readln
end.


Usare le procedure
Ho riscritto lo stesso programma, però usando esclusivamente le procedure e dichiarando un nuovo tipo vettore, che poi non è altro che un array di 100 valori.
program sel_cas;
uses crt;
type vettore=array[0..100] of string[50];
var nomi:vettore;
    index:integer;

(*Questa procudera acquisisce tutti i nomi dei partecipanti*)
procedure acquisisci(var val:vettore;var contatore:integer);
begin
    repeat
    write(contatore,'- Inserire il nome del partecipante: ');
    (*Legge il nome inserito*)
    readln(val[contatore]);
    (*Incrementa l'indice di 1*)
    contatore:=contatore+1;
    until val[contatore-1]='';
    (*E' da notare che, quando l'utente vuole uscire dal ciclo, immette
    una stringa vuota, ma il contatore, dopo, viene comunque aumentato
    di 1: perciò è necessario diminuire di 1 il contatore per ottenere
    l'indice reale dei dati immessi, altrimenti se ne avrebbe uno in
    più (l'ultimo sarebbe vuoto)*)
    contatore:=contatore-1;
end;

(*Questa procedura scrive gli abbinamenti*)
procedure abbina(val:vettore;max:integer);
var i,volte,abbinamenti,riserva:integer;
begin
    clrscr;
    write('Abbina 2 partecipanti alla volta, per quante volte? ');
    (*Legge il numero di combinazioni da fare*)
    readln(volte);
    (*Inizializza la randomizzazione: poichè il computer non è già di
    per sè predisposto a generare numeri casuali, questa istruzione
    comunica all'elaboratore di tenersi pronto a quest'operazione*)
    randomize;
    (*Per volte volte abbina casualmente due nomi diversi*)
    for i:=1 to volte do
      begin
      (*Sceglie un numero a caso*)
      abbinamenti:=random(max);
      (*E scrive il nome associato a quel numero nel vettore*)
      write(i,'- ',nomi[abbinamenti],' con ');
      (*Sceglie il secondo membro del sorteggio*)
      riserva:=random(max);
      (*Controlla che non sia uguale al precedente: in questo caso
      aumenta o diminuisce di uno il numero scelto a caso senza,
      però, uscire dai limiti del vettore*)
      if riserva=abbinamenti then
        if riserva<max then
          riserva:=riserva+1
        else
          riserva:=riserva-1;
      (*Poi scrive il secondo membro della coppia*)
      writeln(nomi[riserva],'.');
      end;
end;

begin
    clrscr;
    index:=0;
    acquisisci(nomi,index);
    abbina(nomi,index);
    readln
end.
<< Precedente Prossimo >>
A proposito dell'autore

Programmatore e analista .NET 2005/2008/2010 (in particolare C# e VB.NET), anche nell'implementazione Mono per Linux. Conoscenze approfondite di Pascal, PHP, XML, HTML 4.01/5, CSS 2.1/3, Javascript (e jQuery). Conoscenze buone di C, LUA, GML, Ruby, XNA, AJAX e Assembly 68000. Competenze basilari di C++, SQL, Hlsl, Java.