|
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. |
|