Newsgroup: it.comp.lang.c++
Titolo: Numeri Casuali

Ciao a Tutti
Devo attribuire a una variabile un numero casuale . Ho incluso la libreria
stdlib.h e ho messo l'istruzione
variabile= rand()
La cosa sembra pero' non funzionare visto che a variabile viene attribuito
sempre e solo il numero 41.
Come faccio?
Per limitare il numero casuale in un determinato range? (ad esempio 1-100)
Grazie
Maxy

 Per limitare il numero casuale in un determinato range? (ad esempio 1-100)
La risposta "facile" e' (rand() % 100) + 1.  Pero' in questo modo si
deteriorano le proprieta' statistiche (gia' in genere basse in
partenza) della tua sequenza: se il numero casuale ti serve per un
giochino, questo metodo va benissimo; se invece stai studiando col
metodo di Montecarlo le prestazioni di un rivelatore di particelle che
stai per costruire e' pessimo.  Se vuoi saperne di piu' leggi le FAQ
del NG, dove c'e' un paragrafetto sui numeri casuali; oppure parti
dalla URL 
http://archive.ncsa.uiuc.edu/Apps/CMP/RNG/www-rng.html
 e
naviga un pochetto...
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Univ. of Padova, Dept. of Physics - Padova, Italy            
lor...@pd.infn.it

 sempre e solo il numero 41.
Cosa dice l'help di rand()? Non riporta per caso ad un'altra funzione 
chiamata srand()? Controlla!
-- 
Luc.

 standard C++ si chiama <cstdlib> .
e propio qui' e' il problema. Essendoci solo il prototipo come calcola il
numero pseudo casuale?
Ho provato a mettere
 pensato= ((rand() % 100) + 1)
ma sempre 42 mi da!
Le ho lette le FAQ e ho seguito quanto scritto ma sempre 42 mi da!!!!
Cosa devo fare?
Maxy

 Cosa devo fare?
Usare srand()!
-- 
Luc.

 Luc.


Ho provato anche a mettere
#include <time.h>
      srand(static_cast<unsigned>(time(0)));
      srand(pensato);
come descritto nelle FAQ ma sempre 575 mi da

 writes:

Leggere anche il seguito della mia risposta, dove spiego perche' ed
indico la soluzione in srand (come altri hanno fatto).  Ma chi me lo
fa fare di rispondere in modo (credo) semplice e chiaro ad una
domanda, se chi l'ha fatta non legge la risposta?


Scusate, ma forse non mi sono spiegato. Le FAQ le ho lette e ho implementato
le seguenti soluzioni (uso Dev C++ 4 che tra le altre cose mi sembra abbia
anche un piccolo bug.... ve lo dico in un post separato):
1) Prima soluzione -> Output di pensato sempre pari a 0
#include <iostream.h>
#include <stdlib.h>
int casuale();
int main()
{
      int pensato; //valore pensato dal computer
      int prova; //tentativo del giocatore
      int count;
      pensato= casuale();
      cout<< pensato <<"\n\n";
      cout<< "In questo gioco io ho pensato un numero"
          << "\ne tu dovrai provare a indovinarlo \n\n";
      for(count=0; count<=5; count++)
      {
          cout<< "Prova a indovinare che numero ho pensato \n\n";
          cin>> prova;
          if(prova == pensato)
          {
              cout<< "BRAVO, ha indovinato. Ho proprio pensato il numero "<<
pensato;
              cout<<"\n\n";
              system("PAUSE");
              return 0;
          }
          else
              if (prova > pensato)
                  cout<< "No! Ho pensato un numero piu' basso \n"
                     << "Riprova, hai ancora " << (5-count) << "
possibilita'\n\n";
              else
                  cout<< "No! Ho pensato un numero piu' alto \n"
                      << "Riprova, hai ancora " << (5-count) << "
possibilita'\n\n";
      }
      cout<< "Non hai indovinato. Ho pensato il numero "<< pensato;
      cout<<"\n\n";
      system("PAUSE");
      return 0;
}
int casuale()
{
    static const double divisore= (1.0+RAND_MAX)*100.0;
    return static_cast<int>(rand()/divisore);
}
2) Seconda soluzione -> Output di pensato sempre pari a 575
#include <iostream.h>
#include <stdlib.h>
#include <time.h>
int main()
{
      int pensato; //valore pensato dal computer
      int prova; //tentativo del giocatore
      int count;
      srand(static_cast<unsigned>(time(0)));
      srand(pensato);
      cout<< pensato <<"\n\n";
      cout<< "In questo gioco io ho pensato un numero"
          << "\ne tu dovrai provare a indovinarlo \n\n";
      for(count=0; count<=5; count++)
      {
          cout<< "Prova a indovinare che numero ho pensato \n\n";
          cin>> prova;
          if(prova == pensato)
          {
              cout<< "BRAVO, ha indovinato. Ho proprio pensato il numero "<<
pensato;
              cout<<"\n\n";
              system("PAUSE");
              return 0;
          }
          else
              if (prova > pensato)
                  cout<< "No! Ho pensato un numero piu' basso \n"
                     << "Riprova, hai ancora " << (5-count) << "
possibilita'\n\n";
              else
                  cout<< "No! Ho pensato un numero piu' alto \n"
                      << "Riprova, hai ancora " << (5-count) << "
possibilita'\n\n";
      }
      cout<< "Non hai indovinato. Ho pensato il numero "<< pensato;
      cout<<"\n\n";
      system("PAUSE");
      return 0;
}
Dove sbaglio?

       srand(pensato);
        ^^^^^^ NO!
        pensato=rand(); // o % quello che vuoi per limitarlo....
PS: uno dei miei primi giochi implementati ad 11 anni su C64... 8-OOO
-- 
Luc.

 Luc.

       srand(pensato);
Ma non hai uno straccio di manuale che spieghi cosa sono rand e srand
e come si adoperano?  *DEVE* *ESSERE* *ARRIVATO* con il compilatore
che usi o con il sistema operativo, se sono appena appena decenti.
Ecco qui:
MLO@axcdf4 1 $ uname -a
OSF1 
axcdf4.pd.infn.it
 V4.0 878 alpha alpha
MLO@axcdf4 2 $ man rand
...
SYNOPSIS
  #include <stdlib.h>
  int rand (void);
  void srand(unsigned int seed);
...
DESCRIPTION
  The rand() function returns successive pseudorandom numbers in the range
  from 0 (zero) to RAND_MAX.  The sequence of values returned depends on the
  seed value set with the srand() function.
*QUINDI*: prima chiama srand per inizializzare il generatore; poi
 chiama rand per generare un numero.


 Cosa fa questa istruzione?
Inizializza il generatore di numeri casuali partendo da un 'seme' 
ricavato dall'orario corrente (per essere il seme sempre diverso).
What about your manuals?
-- 
Luc.

 ...
Nel mio stdlib.h c'e' scritto questo
int rand ();
void srand (unsigned int nSeed);
e non mi sarebbe mai venuto in mente di avere un rand(void)


 Herbert Schildt
Scoperto l'ARCANO!
8-PPP
-- 
Luc.

 Luc.

 Scoperto l'ARCANO!
L' AR(CI)CANE ?
Ciao,
Nicola

Luc ha scritto : 

Anche io l'ho fatto :)
Beh penso che cmq l'abbiano fatto quasi tutti all'inizio, se non ricordo
male era anche uno degli esempi sul manuale del basic del C64.
-- 
  _  _ >>Now on Linux<<  _     || ICQ number.................Non lo uso
 | \| |___ _____ ___ ___|_|___ || Home-Page ................Non ce l'ho
 | .` | -_|     | -_|_ -| |_ -||| E-Mail................Non l'avrai mai
 |_|\_|___|_|_|_|___|___|_|___||| Un Nemesis che ha pochi e-contatti ;)

 (Mi sarebbe tornato meglio 42 :-)
lo proponiamo nello standard, alla memoria?

 L' AR(CI)CANE ?
ROTFL
--
Andrea Ferro
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556