Oppure

Loading
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
21/10/12 18:18
Tommaso95
WOW, ho visto che per eseguire un semplice programma come il mio ci vogliono oltr 1'000'000 di operazioni.

Comunque ho creato un altro algoritmo che estrae i numeri direttamente diversi e lo fa in pochissime operazioni (200):
begin

randomize;
     for a:=1  to 100 do 
           begin
             repeat
             aux:=random(1000)+1;
             k:=1;
             while (ele[k]<>aux) and (k < a) do
             k:=k+1;
             until (k>=a);
             ele[a]:=aux
          end;
    end;
end;
aaa