Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Pascal - Algoritmo selezione casuale
Forum - Pascal - Algoritmo selezione casuale

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
djleo (Member)
Pro


Messaggi: 72
Iscritto: 07/03/2010

Segnala al moderatore
Postato alle 14:15
Lunedì, 16/08/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?

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 14:34
Lunedì, 16/08/2010
Testo quotato

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
PM Quote
Avatar
Alex (Ex-Member)
Expert


Messaggi: 441
Iscritto: 15/08/2005

Segnala al moderatore
Postato alle 18:01
Lunedì, 16/08/2010
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)...

PM Quote
Avatar
Alfonso (Ex-Member)
Guru


Messaggi: 688
Iscritto: 30/09/2009

Segnala al moderatore
Postato alle 19:09
Lunedì, 16/08/2010
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

  1. Do While n > -1
  2.         t = Int(n * Rnd)
  3.         List1.AddItem arrN(t)
  4.         If t <> n Then
  5.             arrN(t) = arrN(n)
  6.         End If
  7.         n = n - 1
  8.     Loop


PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 12:05
Martedì, 17/08/2010
Testo quotato

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

  1. Do While n > -1
  2.         t = Int(n * Rnd)
  3.         List1.AddItem arrN(t)
  4.         If t <> n Then
  5.             arrN(t) = arrN(n)
  6.         End If
  7.         n = n - 1
  8.     Loop




Algoritmo davvero interessante! Bravo Alfonso :k:

Solo una cosa non capisco: perchè controlli che t sia diverso da n?

PM Quote
Avatar
djleo (Member)
Pro


Messaggi: 72
Iscritto: 07/03/2010

Segnala al moderatore
Postato alle 13:21
Martedì, 17/08/2010
Grazie... Ma questo non è vb
Codice sorgente - presumibilmente VB.NET

  1. Do While n > -1
  2.         t = Int(n * Rnd)
  3.         List1.AddItem arrN(t)
  4.         If t <> n Then
  5.             arrN(t) = arrN(n)
  6.         End If
  7.         n = n - 1
  8.     Loop


PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 14:06
Martedì, 17/08/2010
Testo quotato

Postato originariamente da djleo:

Grazie... Ma questo non è vb



La sintassi è quella del Visual Basic.

PM Quote
Avatar
djleo (Member)
Pro


Messaggi: 72
Iscritto: 07/03/2010

Segnala al moderatore
Postato alle 14:12
Martedì, 17/08/2010
Dove che ho sbagliato

Codice sorgente - presumibilmente Delphi

  1. program SelCasBool;
  2. uses wincrt;
  3. const n=30;
  4. type VBoll=array[1..n]of boolean;
  5.      VStr=array[1..n]of string;
  6.      Mstr=array[1..n,1..2]of string;
  7. var i,lung,a,b,j:integer;
  8.     vb:VBoll;
  9.     vs:VStr;
  10.     cal:Mstr;
  11.     fr:text;
  12. begin
  13.  assign(fr,'gioca.txt');
  14.  reset(fr);
  15.  lung:=0;
  16.  while not eof(fr) do
  17.   begin
  18.    lung:=lung+1;
  19.    readln(fr,vs[lung]);
  20.    vb[lung]:=false;
  21.   end;
  22.  close(fr);
  23. for j:=1 to lung do
  24. begin
  25.  randomize;
  26.  repeat
  27.   a:=random(lung)+1;
  28.   if vb[a]=false then
  29.                   begin
  30.                    vb[a]:=true;
  31.                    cal[j,1]:=vs[a];
  32.                   end;
  33.   b:=random(lung)+1;
  34.   if vb[b]=false then
  35.                   begin
  36.                    vb[b]:=true;
  37.                    cal[j,2]:=vs[b];
  38.                   end;
  39.  until (vb[a]<>false) or (vb[b]<>false);
  40. end;
  41. for j:=1 to lung do
  42.  writeln(vb[j],'-',vs[j]);
  43. end.




PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 14:50
Martedì, 17/08/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

  1. program casuale;
  2. uses crt;
  3. const n=30;
  4. type VStr=array[1..n]of string;
  5.      Mstr=array[1..n,1..2]of string;
  6. var lung,j:word;
  7.     vs:VStr;
  8.     cal:Mstr;
  9.     fr:text;
  10.  
  11. procedure OrdinaCasuale(var v:VStr; fine:word);
  12. var i,pos:word;
  13.     temp:string;
  14. begin
  15.  for i:=1 to fine-1 do
  16.  begin
  17.    pos:=i+random(fine-i); // estrae un giocatore
  18.    temp:=v[i]; // scambio dei giocatori
  19.    v[i]:=v[pos];
  20.    v[pos]:=temp;
  21.  end;
  22. end;
  23.  
  24. procedure campionato(var mv:Mstr; v:VStr; fine:word);
  25. var i,j:word;
  26. begin
  27.   i:=1;
  28.   j:=1;
  29.   while i<fine-1 do
  30.   begin
  31.     mv[j, 1]:=v[i];
  32.     mv[j, 2]:=v[i+1];
  33.     i:=i+2;
  34.     j:=j+1
  35.   end;
  36. end;
  37.  
  38. begin
  39. assign(fr,'gioca.txt');
  40. reset(fr);
  41. lung:=0;
  42. while not eof(fr) do
  43. begin
  44.    lung:=lung+1;
  45.    readln(fr,vs[lung]);
  46. end;
  47. close(fr);
  48. randomize;
  49. OrdinaCasuale(vs, lung);
  50. Campionato(cal, vs, lung);
  51. for j:=1 to lung do  // stampo il vettore
  52.   writeln(j,'-',vs[j]);
  53. writeln;
  54. for j:=1 to (lung div 2) do // stampo le selezioni:
  55.   writeln(cal[j, 1]:15,' VS ',cal[j, 2]:15);
  56. readln;
  57. end.



Inoltre, ti suggerisco di utilizzare i file binari.

Ultima modifica effettuata da Poggi Marco il 17/08/2010 alle 15:28
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo