|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Jul 2006
Messaggi: 96
|
[C] creare array con valori casuali
Salve, devo creare un array di tipo struct di questo tipo :
Codice:
struct _team
{
int player [5];
}
typedef struct Team
Codice:
{
team la_squadra[8]
}
Codice:
Giocatore array_giocatore[40] |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
|
Quindi per fare in modo che un giocatore compaia in una sola squadra?
Io un'idea ce l'avrei, è anche abbastanza semplice; ma prima devi dirci tu come avresti intenzione di farlo. Bye!
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Riempi l'array in ordine da 1 a 40.
Poi lascialo per un paio di giorni vicino alla mia scrivania. Te lo ritroverai automaticamente disordinato, per simpatia con tutto il resto.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
|
#5 | |
|
Member
Iscritto dal: Jul 2006
Messaggi: 96
|
Quote:
Codice:
for (i=1;i<8;i++)
{
while (j<5)
{
la_squadra[i].player[j]=rand()% .. ; ".." al posto dei puntini ho sempre utilizzato numeri lo posso usare per prelevare un valore da un altro array?
j++;
}
|
|
|
|
|
|
|
#6 |
|
Member
Iscritto dal: Jul 2006
Messaggi: 96
|
Leggendo su un altro forum, alcuni parlavano di usare un indice per estrarre valori casuali da un array, considerando il mio caso, in questo modo:
Codice:
for (i=0;i<5;i++)
{
indice = rand()%88;
array_squadra[1].player[i]=array_giocatori[indice].nome;
}
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
|
Quote:
Modificando l'array_giocatori lo fai in un attimo.
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO |
|
|
|
|
|
|
#8 |
|
Member
Iscritto dal: Sep 2003
Città: Genova
Messaggi: 177
|
Ad esempio dichiari una "mappa" coi 40 giocatori; ad ogni nuova estrazione casuale verifichi che quel valore sia già stato distribuito.
Codice:
char assegnato[40];
memset(assegnato, 0, sizeof(assegnato));
int *giocatori = NULL;
giocatori = (int *)malloc(5 * 8);
if (giocatori == NULL) ...
giocatori[0] = &(array_squadra[0].player[0]);
...
giocatori[x] = &(array_squadra[y].player[z]);
int assegnati = 0;
ciclo "estrazione casuale" per 40 giocatori
{
estraggo un giocatore X (valori da 1 a 40 immagino)
è già stato assegnato?
no:
assegnato[X] = 1;
"assegno il giocatore array_giocatore[X] alla squadra"
*giocatori[assegnati++] = X;
ne ho assegnati 40?
ok, usciamo dal ciclo
}
Ultima modifica di wizardgsz : 08-04-2010 alle 10:23. |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Questa soluzione va bene fintanto che i valori sono pochi.
E' un algoritmo parecchio inefficiente. Immagina che i valori siano 1.000.000 e che ne abbia gia' estratti 999.999. Per estrarre l'ultimo dovrai aspettare fino a che non estrarrai proprio il valore che manca, che ti arrivera' appunto con probabilita' 1/1000000 C'e' un algoritmo molto piu' lineare, per ottenere quanto richiesto.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
|
Quote:
Io userei il giocatore estratto casualmente solo come entry point. Poi, se è già associato ad una squadra, scorrerei linearmente l'array fino a trovarne uno libero.
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO |
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
|
#12 |
|
Member
Iscritto dal: Sep 2003
Città: Genova
Messaggi: 177
|
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Potrai quindi applicare il modo piu' efficiente sempre, sia quando i valori in gioco sono pochi, sia quando sono molti.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Feb 2010
Messaggi: 466
|
un altro metodo è quello di non estrarre i valori ma gli indici dell'array , ma va bene per valori non troppo grandi vista la complessità O(n^2)
Codice:
int i;
int num_elem = 100;
int vet[100];
int vet2[100];
for( i=0 ; i < num_elem ; i++)
{
vet[i] = i;
vet2[i] = 0;
}
for(i=0; i< num_elem ; i++)
{
int k = random( num_elem - i) ;
vet2[i] = vet[k];
for( j= k+1 ; j< num_elem - i+1 ; j++)
{
vet[j-1] = vet[ j ] ;
}
}
for(i=0; i< num_elem ; i++)
{
printf("%d ",vet2[i];
}
printf("\n");
__________________
I robot hanno scintillanti fondoschiena metallici che non dovrebbero essere baciati. |
|
|
|
|
|
#15 | |
|
Member
Iscritto dal: Jul 2006
Messaggi: 96
|
Quote:
Si supponga di gestire un torneo di calcio tra 8 squadre. Inizialmente vengono considerati 88 giocatori identificati dal Cognome e Nome (anche solo lettere casuali). Si suppone che ogni giocatore possa assumere qualsiasi ruolo in campo. Ad ogni giocatore viene assegnato un numero casuale nell’intervallo [0,10]. In maniera casuale vengono create 8 squadre. Suggerimento: L’algoritmo usa la function rand() in stdlib per generare numeri casuali: si ricorda che, per esempio, se numero_casuale è un int, la chiamata numero_casuale=rand()%11; genera un numero casuale intero (distribuzione uniforme) nell’insieme (0,1,2,3,4,5,6,7,8,9,10). Usare sempre la srand() per rendere automatica la scelta iniziale del seed della sequenza di numeri casuali. e in effetti ora mi accorgo di aver commesso un altro errore nel dichiarare le struct Codice:
struct _giocatore
{
char cognome[5];
char nome[5];
int valore;
};
typedef struct _giocatore Giocatore;
e tra l'altro dovrei andare ad estrapolare un nome e un cognome casuale quindi sono 2 valori |
|
|
|
|
|
|
#16 | |
|
Member
Iscritto dal: Sep 2003
Città: Genova
Messaggi: 177
|
Hi hi mi sembri il collega qui di fronte quando, dovendo affrontare un problema col Cliente e risolvere l'espressione "1 + 1", si inventa la soluzione universale per le equazioni di terzo grado.
Soluzione semplice e veloce: 1 minuto Soluzione efficiente, elegante, "universale": 1 giornata ![]() Peccato che il Cliente ci paghi solo la prima ora di lavoro Quote:
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:34.





















