18/10/12 20:32
Poggi Marco
L' idea è impostare un ciclo che ad ogni iterazione, generi un numero sul vettore.
Quindi predispongo l' array
procedure precarica(var ele:tab; fine:integer); (* fine è la dimensione del vettore *)
var i:integer;
begin
for i:=1 to fine do
begin
ele[i]:=i;
end;
end;
Casualizzo il vettore:
procedure casualizza_vettore(var ele:tab; fine:integer);
var i,estratto,scambio:integer;
begin
precarica(ele, fine);
for i:=1 to fine-1 do
begin
// genero un numero casuale che abbia un range uguale ai cicli ancora da effettuare, e parta da i+1
estratto:=i+1+random(fine-i);
// lavoro sulle posizioni del vettore
scambio:=ele[i];
ele[i]:=ele[estratto];
ele[estratto]:=scambio;
end;
end;
Ultima modifica effettuata da Poggi Marco 18/10/12 20:35
aaa
18/10/12 21:02
Goblin
Provo a spiagarmi meglio per far capire il meccanismo:
1) Inizializzo un array di comodo (aDummy) con i 100 numeri da 1 a 100
2) Creo un ciclo che deve arrivare sino a 100
3) Dentro il ciclo estraggo un numero casuale tra 1 e 100
4) Controllo che il numero generato (passato come indice all'array di comodo) non sia già stato estratto, in quanto nel caso di avvenuta estrazione il valore nell'array di comodo è -1
5) Se il test è positivo metto nel primo elemento dell'array risultante il numero estratto
6) Setto il valore dell'elemento estratto in aDummy a -1 in questo modo se lo stesso numero viene generato il test al punto 4 fallisce, nessun incremento e genero un nuovo numero
7) Incremento l'indice per il successivo numero da generare, in questo modo alla fine di tutto l'array ele avrà 100 elementi diversi e casuali e tutti gli elementi dell'array adummy saranno a -1
for x:= 1 to 100 do
aDummy[x] := x;
nciclo:=1;
While nCiclo<=100 do
begin
nEstratto := random(100)+1;
if aDummy[nEstratto] <> -1 then
begin
ele[nCiclo] := aDummy[nEstratto];
aDummy[nEstratto] := -1;
inc(nCiclo);
end;
end;
Spero di essere stato un po' più chiaro
Ibis redibis non morieris in bello
18/10/12 21:19
Goblin
Vero Marco!!!! correggimi se sbaglio, praticamente una funzione di shuffle su un array di elementi predefiniti equivale ad una generazine casuale....
Ibis redibis non morieris in bello
19/10/12 11:38
Poggi Marco
Si. L' idea è quella di lavorare sugli indici del vettore, anziché sui valori.
Devo ammettere che non sono un matematico; quindi non so dimostrare che ne risulti un vettore di numeri pseudocasuali attendibile.
aaa
20/10/12 23:20
Tommaso95
Mi avete fatto incuriosire: Si può vedere su pascal il numero di operazioni necessarie ad eseguire quel programma?
aaa
21/10/12 16:25
Poggi Marco
Si, è possibile contare quanti cicli richiede un processo, ed in quanto tempo. Basta utilizzare una variabile come contatore.
aaa