
djleo (Member)
Pro
    
Messaggi: 72
Iscritto: 07/03/2010
|
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?
|
|

Poggi Marco (Member)
Guru
    
Messaggi: 969
Iscritto: 05/01/2010
|
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 il 16/08/2010 alle 14:35 |
|

Alex (Ex-Member)
Expert
    
Messaggi: 441
Iscritto: 15/08/2005
|
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)...
|
|

Alfonso (Ex-Member)
Guru
    
Messaggi: 688
Iscritto: 30/09/2009
|
Non c'è due senza tre!
Dato un arrN(n) di n elementi, credo che più semplice di così sia impossibile:
Codice sorgente - presumibilmente VB.NET |
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
|
|
|

Poggi Marco (Member)
Guru
    
Messaggi: 969
Iscritto: 05/01/2010
|
Postato originariamente da Alfonso:
Non c'è due senza tre!
Dato un arrN(n) di n elementi, credo che più semplice di così sia impossibile:
Codice sorgente - presumibilmente VB.NET |
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
Solo una cosa non capisco: perchè controlli che t sia diverso da n? |
|

djleo (Member)
Pro
    
Messaggi: 72
Iscritto: 07/03/2010
|
Grazie... Ma questo non è vb
Codice sorgente - presumibilmente VB.NET |
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
|
|
|

Poggi Marco (Member)
Guru
    
Messaggi: 969
Iscritto: 05/01/2010
|
Postato originariamente da djleo:
Grazie... Ma questo non è vb
|
La sintassi è quella del Visual Basic. |
|

djleo (Member)
Pro
    
Messaggi: 72
Iscritto: 07/03/2010
|
Dove che ho sbagliato
Codice sorgente - presumibilmente Delphi |
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.
|
|
|

Poggi Marco (Member)
Guru
    
Messaggi: 969
Iscritto: 05/01/2010
|
Ho letto il tuo programma.
Il difetto sta nel ciclo del sorteggio: ad ogni iterazioneestrai 2 giocatori.
Inoltre la condizione d' uscita del ciclo interno, è errata.
Dovresti fare in questo modo;
Codice sorgente - presumibilmente Delphi |
program casuale; uses crt; const n=30; type VStr=array[1..n]of string; Mstr=array[1..n,1..2]of string; var lung,j:word; vs:VStr; cal:Mstr; fr:text; procedure OrdinaCasuale(var v:VStr; fine:word); var i,pos:word; temp:string; begin for i:=1 to fine-1 do begin pos:=i+random(fine-i); // estrae un giocatore temp:=v[i]; // scambio dei giocatori v[i]:=v[pos]; v[pos]:=temp; end; end; procedure campionato(var mv:Mstr; v:VStr; fine:word); var i,j:word; begin i:=1; j:=1; while i<fine-1 do begin mv[j, 1]:=v[i]; mv[j, 2]:=v[i+1]; i:=i+2; j:=j+1 end; end; begin assign(fr,'gioca.txt'); reset(fr); lung:=0; while not eof(fr) do begin lung:=lung+1; readln(fr,vs[lung]); end; close(fr); randomize; OrdinaCasuale(vs, lung); Campionato(cal, vs, lung); for j:=1 to lung do // stampo il vettore writeln(j,'-',vs[j]); writeln; for j:=1 to (lung div 2) do // stampo le selezioni: writeln(cal[j, 1]:15,' VS ',cal[j, 2]:15); readln; end.
|
Inoltre, ti suggerisco di utilizzare i file binari.
Ultima modifica effettuata da Poggi Marco il 17/08/2010 alle 15:28 |
|