PDA

Visualizza la versione completa : [C++] Generare numeri random


Lupin
20-08-2005, 17:44
Salve !
Sono un appassionato del C++ e da un pò di tempo sto cercando di capirci qualcosa, ho comprato da poco un bel libro intitolato fondamenti di c++ della Mc Graw Hill e nel capitolo tre ho trovato questa esercitazione ma penso che abbia un bug in quanto il numero che dovrebbe essere random è sempre il 41 come è possibile? Ed inoltre come si può rimediare.
Un'altra domanda come si fà ad impostare un numero random dandogli un valore massimo cioè che non superi per esempio 100
ho pensato forse con un ciclo for, ma non sono ancora così bravo da impostarlo in maniera corretta.
Vi ringrazio anticipatamente.
Il listato è il seguente:

#include <iostream>
#include <cstdlib>
using namespace std;

int main()
{
int magic; // numero magico
int guess; // tentativo del giocatore

magic = rand(); // sceglie un numero a caso

do {
cout << "Scrivi il tuo numero: ";
cin >> guess;
if(guess == magic) {
cout << "** Giusto ** ";
cout << magic << " è il numero magico.\n";
}
else {
cout << "...Mi dispiace, hai sbagliato.";
if(guess > magic)
cout << " Il tuo numero è troppo alto.\n";
else cout << " Il tuo numero è troppo basso.\n";
}
} while(guess != magic);

return 0;
}

netarrow
20-08-2005, 17:51
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
int magic; // numero magico
int guess; // tentativo del giocatore

srand(time(0));//seleziona il seme

magic = rand();
//così è troppo difficile trovare il numero, puoi fare fra 1 e 100
//così:
//magic = 1 + rand() % 100;


do {
cout << "Scrivi il tuo numero: ";
cin >> guess;
if(guess == magic) {
cout << "** Giusto ** ";
cout << magic << " è il numero magico.\n";
}
else {
cout << "...Mi dispiace, hai sbagliato.";
if(guess > magic)
cout << " Il tuo numero è troppo alto.\n";
else cout << " Il tuo numero è troppo basso.\n";
}
} while(guess != magic);

return 0;
}


Con srand crei un seme per generare numeri casuali, se vuoi creare un numero fra x e y devi fare:

rand = x + rand() % y

:ciauz:

infinitejustice
20-08-2005, 18:03
per avere un seme sempre diverso potresti anche dargli
srand(static_cast<unsigned int>(time(NULL)));

Tanto pero alla fine son sempre numeri pseudocasuali :zizi:

Lupin
20-08-2005, 18:24
Grazie per la celerità !
Ho appena cercato di modificare e compilare il listato ma non funziona, sicuramente ho commesso un altro errore.



#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
int magic; // numero magico
int guess; // tentativo del giocatore
srand(time(0));
rand = 1 + rand() % 100 //seleziona il seme


//così è troppo difficile trovare il numero, puoi fare fra 1 e 100
//così:
//magic = 1 + rand() % 100;


do {
cout << "Scrivi il tuo numero: ";
cin >> guess;
if(guess == magic) {
cout << "** Giusto ** ";
cout << magic << " è il numero magico.\n";
}
else {
cout << "...Mi dispiace, hai sbagliato.";
if(guess > magic)
cout << " Il tuo numero è troppo alto.\n";
else cout << " Il tuo numero è troppo basso.\n";
}
} while(guess != magic);

return 0;
}

Ho cercato di dare un valore massimo di 100 se no diventa molto difficile !
:messner:

infinitejustice
20-08-2005, 18:42
Prova a dre un'occhiata a questo...

void main(){

srand(static_cast<int>(time(NULL)));

int guess = 0;
int magic = rand() % 100 + 1;

while(guess != magic){
std::cout << "Inserisci il numero magico: ";
std::cin >> guess;

if(guess == magic){
std::cout << "Corretto" << std::endl;
break;
}

else{
std::cout << "Sbagliato" << std::endl;
if(guess > magic)
std::cout << "Il tuo numero e\' troppo alto.";
else
std::cout << "Il tuo numero e\' troppo basso.";

std::cout << "Il numero corretto e\': " << magic << std::endl;
break;
}
}
}

Ho messo dei break per far uscire il ciclo while in caso di numero corretto o sbagliato. Se pero si esce subito al primo errore non ha nemmeno senso in realtà fare un ciclo... cmq cosi funzia :zizi:

Lupin
20-08-2005, 19:58
Ok funziona il tuo programma !
Ora faccio una piccola modifica per far inoltrare vari tentativi fino alla risposta esatta.
Grazie
:ciauz: :ciauz:

Barman@83
21-08-2005, 01:36
Originariamente inviato da infinitejustice
Prova a dre un'occhiata a questo...

[FONT=courier new]void main(){

srand(static_cast<int>(time(NULL)));
.....

:zizi:

Scusate la domanda da perfetto neofita ma se io metto void main()...
il compilatore mi da errore e dice che main deve restituire solo numeri interi...

Perchè a voi funziona con void?

infinitejustice
21-08-2005, 09:26
Usi Dev-Cpp ? :stordita:
Dovrebbe darti un warning cmq, non un errore.

edit: il valore viene restituito al sistema operativo. Alcuni compilatori ti fanno delle storie se metti void, altri no.

anx721
21-08-2005, 11:15
Originariamente inviato da Barman@83
Scusate la domanda da perfetto neofita ma se io metto void main()...
il compilatore mi da errore e dice che main deve restituire solo numeri interi...

Perchè a voi funziona con void?

perchè il

void main()

non è più c++ standard e il mingw (il compilatpre di devcpp) non te lo accetta e no ndovresti usarlo. Il main deve ritornare un int.

Barman@83
21-08-2005, 16:05
ma cosa cambia su uso int e se uso void?
a parte la tipologia di numeri (interi o a virgola mobile)

Loading