Guida Pascal
Capitolo 23° - Appendice 4 Numeri a caso
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.
C#, TypeScript, java, php, EcmaScript (JavaScript), Spring, Hibernate, React, SASS/LESS, jade, python, scikit, node.js, redux, postgres, keras, kubernetes, docker, hexo, etc...
|