PDA

Visualizza la versione completa : Funzione Rand in C


Ponza
06-01-2005, 18:40
Ciao a tutti, sono un "programmatore" alle prime armi (un semestre di informatica al Politecnico di Milano) e ho un problema che nn riesco a risolvere.

Dunque, in C esiste la funzione rand() che restituisce un valore random tra 0 e un valore MAX definito nella libreria stdlib.h

Io ho scritto questo codice, di per se semplicissimo:

for(j=0;j<5;j++)
{
x=rand();
m=x;
printf("%d\n",m);
x=0;
m=0;
}

è mai possibile che mi stampa gli stessi 5 numeri ogni volta che faccio partire il programma?Io vorrei che ogni volta che chiamo la funzione rand() , lei mi dia ogni volta dei numeri diversi!! come faccio? grazie ciao a tutti

Lardoman 2.0
06-01-2005, 18:55
aggiungi prima dell'inizio del for



srand (time(NULL)) ;


ah , e devi anche includere time.h e math.h

Ponza
06-01-2005, 19:08
grazie mille Lardoman....grazie davvero.


già che ci sono vi faccio vedere il codice che ho scritto, in pratica devo fare il gioco quello dove il pc sceglie una sequenza casuale di 4 colori tra 6-7 disponibili e voi dovete indovinarla.Il pc vi dice, dopo che avete tentato di indovinare, quanti colori al posto esatto avete indovinato o quanti colori avete indovinato ma non sono al posto esatto.


CODICE (http://xoomer.virgilio.it/ponza85/giocorandom.cpp)


Il programma in pratica "sbaglia" il conteggio di quelli giusti al posto giusto o quelli giusti alposto sbagliato...uff mi sto dannando....so che voi che siete bravi potete darci un occhiatina :(

netarrow
06-01-2005, 21:15
[...]
// 0 1 2 3 4 5
char colori[6] = { 'b', 'v', 'g', 'a', 'r', 'm'};//qui c'era una virgola in più
[...]
appoggio=rand()%5;//il limite deve essere 5 visto che l'array parte da 0 e termina con indice 5 come mostra in alto
[...]


Spero di aver visto tutto... e di non aver corretto cose giuste :fagiano:

:ciauz:

anx721
06-01-2005, 21:56
Il prolema principale sta nell'istruzione

gets(sequenzautente);

la quale legge una stringa da input memorizzandola nell'array sequenzautente; ma in C le stringhe sono terminate anche dal carattere nullo '\0', che viene inserito come utlimo carattere della stringa stessa; ora se tu hai dichiarato un array sequenzautente di 4 posizioni, questo conterrà i quattro caratteri che rappresentano i colori, pero poi la gets ci mette anche il carattere di fine stringa, ma sequenzautente puo contenere solo 4 caratteri, quindi quel carattere nullo viene scritto in una posizione di memoria che non appartiene più all'array, ma che ad esempio nel caso del mio compilatore, e probabilmente anche nel tuo, corrisponde alla prima posizione dell'altro array che dichiari, ovvero sequenzapc, infatti se provi a stampare sequenzapc dopo la gets, ti rendi conto che la prima posizione di sequenzapc come intero è diventata 0, che corrisponde al carattere '\0'; per risolvere il problema basta dichiarare sequenzautente come array di 5 caratteri; un altro problema penso che sia il conteggio dei colori che non si trovano nella stessa posizione nei due array, perche quando trovi una corrispondenza tra due colori in posizioni uguali o diverse nei due array, devi ad esempio cancellarli, perke se no puoi contare lo stesso colore piu volte; ho modificato quindi i cicli for, in modo tale che quando si trova un colore, le corrispondendti posizioni degli array vengono azerate: in questo modo bianchi + neri è sempre <= 4:



printf("\n\nI colori sono: Blu Verde Giallo Arancio Rosso Marrone\n\n");
printf("Inserisci la tua sequenza (max 4 colori): ");

gets(sequenzautente);

//prima controllo i colori se sono uguali posizione per posizione
for(j=0;j<4;j++){
if(sequenzautente[j]==sequenzapc[j]){
neri++;
sequenzapc[j] = 0;
sequenzautente[j] = 0;
}
}
//Poi controllo se qualke colore di sequenzapc puo essere fatto
//corrispondere con un colore di sequenzautente in diveersa posizione
for(j=0;j<4;j++){
//Se il colore nella posizione j non l'ho trovato ancora...
if(sequenzapc[j] != 0){
//lo conronto con le altre posizioni
for(k=0;k<4;k++){
if(sequenzautente[k]==sequenzapc[j]){
bianchi++;
sequenzautente[k] = 0;
sequenzapc[j] = 0;
break;
}
}
}
}

anx721
06-01-2005, 21:58
Originariamente inviato da netarrow


[...]
// 0 1 2 3 4 5
char colori[6] = { 'b', 'v', 'g', 'a', 'r', 'm'};//qui c'era una virgola in più
[...]
appoggio=rand()%5;//il limite deve essere 5 visto che l'array parte da 0 e termina con indice 5 come mostra in alto
[...]


Spero di aver visto tutto... e di non aver corretto cose giuste :fagiano:

:ciauz:

n modulo 6 è un numero compreso tra 0 e 5 perchè se divido per 6 il resto della divisione e strettamente minore di 6; quindi quell'istruzione era corretta

Ponza
07-01-2005, 01:47
mai trovato gente tanto disponibile...coi tempi che corrono non ci speravo più!


Grazie mille a tutti, davvero, ho trovato un forum a cui posso chiedere le cose che non capisco...sperando di passare quello stramaledetto esame di informatica...


GRAZIE

ps: il programmino è ok al 95% devo ancora perfezionarlo per quanto riguarda la logica, cmq ve lo regalo!divertitevi! eheh :smack:


GIOCONE (http://xoomer.virgilio.it/ponza85/giocone.exe)

Loading