Oppure

Loading
16/08/10 12:15
djleo
Ciao, a tutti mi servirebbe un aiuto per un algoritmo come da titolo. Allora mi spiego:
L'algoritmo che ho intenzione di scrivere dovrebbe fare questo:
1) Caricare in un array un elenco di nomi letto da file(giocatori partecipanti ad un torneo);
2) Creare una matrice con gli accoppiamenti tra due giocatori a caso senza ripetizione;

il punto uno l'ho fatto mi manca il punto 2 non riesco a fare gli accoppiamenti, cioè nn riesco afarli senza ripetizione es:

a vs b ok
b vs c no
d vs e ok

come posso fare?
aaa
16/08/10 12:34
Poggi Marco
Postato originariamente da djleo:

Ciao, a tutti mi servirebbe un aiuto per un algoritmo come da titolo. Allora mi spiego:
L'algoritmo che ho intenzione di scrivere dovrebbe fare questo:
1) Caricare in un array un elenco di nomi letto da file(giocatori partecipanti ad un torneo);
2) Creare una matrice con gli accoppiamenti tra due giocatori a caso senza ripetizione;

il punto uno l'ho fatto mi manca il punto 2 non riesco a fare gli accoppiamenti, cioè nn riesco afarli senza ripetizione es:

a vs b ok
b vs c no
d vs e ok

come posso fare?


La soluzione è molto semplice:

1) carica un vettore contenente tutti i giocatori (ogniuno una sola volta)

2) esegui un ciclo che va da 1 a n°giocatori-1 in questo modo:
- genera un numero casuale (n) compreso tra l' indice del ciclo e il numero di giocatori
- n indicherà il giocatore estratto (seleziona il giocatore con la posizione n nel
vettore.
- Scambia i giocatori nel vettore che hanno posizione n e l' indice del ciclo.
(In questo modo, i giocatori già estratti non vengono ripescati)
Ultima modifica effettuata da Poggi Marco 16/08/10 12:35
aaa
16/08/10 16:01
Alex
io avrei invece creato un'array di valori booleani uguale per dimensioni a quella dei giocatori che mi terrà traccia se il giocatore è già stato estratto. successivamente:

1) genero un numero casuale
2) controllo sull'array di booleani in corrispondenza del numero casuale che valore c'è:
3)se c'è false allora lo metto a true e restituisco il numero estratto
se c'è già true vuol dire che è gia stato estratto e ritorno al punto 1)...
aaa
16/08/10 17:09
Alfonso
Non c'è due senza tre!
Dato un arrN(n) di n elementi, credo che più semplice di così sia impossibile:
    Do While n > -1
        t = Int(n * Rnd)
        List1.AddItem arrN(t)
        If t <> n Then
            arrN(t) = arrN(n)
        End If
        n = n - 1
    Loop
aaa
17/08/10 10:05
Poggi Marco
Postato originariamente da Alfonso:

Non c'è due senza tre!
Dato un arrN(n) di n elementi, credo che più semplice di così sia impossibile:
    Do While n > -1
        t = Int(n * Rnd)
        List1.AddItem arrN(t)
        If t <> n Then
            arrN(t) = arrN(n)
        End If
        n = n - 1
    Loop


Algoritmo davvero interessante! Bravo Alfonso :k:

Solo una cosa non capisco: perchè controlli che t sia diverso da n?
aaa
17/08/10 11:21
djleo
Grazie... Ma questo non è vb
   
 Do While n > -1
        t = Int(n * Rnd)
        List1.AddItem arrN(t)
        If t <> n Then
            arrN(t) = arrN(n)
        End If
        n = n - 1
    Loop
aaa
17/08/10 12:06
Poggi Marco
Postato originariamente da djleo:

Grazie... Ma questo non è vb


La sintassi è quella del Visual Basic.
aaa
17/08/10 12:12
djleo
Dove che ho sbagliato

program SelCasBool;
uses wincrt;
const n=30;
type VBoll=array[1..n]of boolean;
     VStr=array[1..n]of string;
     Mstr=array[1..n,1..2]of string;
var i,lung,a,b,j:integer;
    vb:VBoll;
    vs:VStr;
    cal:Mstr;
    fr:text;
begin
 assign(fr,'gioca.txt');
 reset(fr);
 lung:=0;
 while not eof(fr) do
  begin
   lung:=lung+1;
   readln(fr,vs[lung]);
   vb[lung]:=false;
  end;
 close(fr);
for j:=1 to lung do
begin
 randomize;
 repeat
  a:=random(lung)+1;
  if vb[a]=false then
                  begin
                   vb[a]:=true;
                   cal[j,1]:=vs[a];
                  end;
  b:=random(lung)+1;
  if vb[b]=false then
                  begin
                   vb[b]:=true;
                   cal[j,2]:=vs[b];
                  end;
 until (vb[a]<>false) or (vb[b]<>false);
end;
for j:=1 to lung do
 writeln(vb[j],'-',vs[j]);
end.


aaa