|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: May 2007
Città: Milano
Messaggi: 7103
|
[C++] Classe che genera numeri a caso
E da un po che non programmavo e oggi ho ripreso...
Codice:
#include <cstdlib> #include <ctime> class Gen { private: int *list; int range; int seed; int gen_casual(); void SetRange(int v=100){ range=v; }; int GetRange(){ return range; }; public: Gen(int c, int s=time(NULL)); ~Gen(); int *GetList(int n=50); }; Gen::Gen(int c, int s) { seed = s; SetRange(c); srand(seed); } Gen::~Gen() { // TODO delete list; } int Gen::gen_casual() { return (int)( rand() % GetRange() + 1 ); } int *Gen::GetList(int n) { list = new int[n]; for(int i=0; i < n; i++) { list[i] = gen_casual(); } return list; }
__________________
Apple Watch Ultra + iPhone 15 Pro Max + Rog Ally + Legion Go Ultima modifica di The_ouroboros : 12-07-2007 alle 16:06. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Tieni presente che la impostazione del 'seed' con srand è una cosa "globale", non ha quindi senso farla nel costruttore della classe.
Io, come base, farei così: Codice:
#include <cstdlib> #include <ctime> class Rnd { private: int min; int max; public: Rnd (int min, int max); int next (); static void seed (); static void seed (unsigned int seed); }; Rnd::Rnd (int min, int max) { this->min = min; this->max = max; } int Rnd::next () { double d = rand () / (RAND_MAX+1.0); return ((int) (d * (max-min+1))) + min; } void Rnd::seed () { srand ((unsigned int) time (NULL)); } void Rnd::seed (unsigned int seed) { srand (seed); }
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) Ultima modifica di andbin : 12-07-2007 alle 16:20. |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Io ci metterei anche qualcosa di questo tipo:
Codice:
#include <cstdlib> #include <ctime> class Rnd { private: int min; int max; static boolean seeded; public: Rnd (int min, int max); int next (); static void seed (); static void seed (unsigned int seed); }; Rnd::Rnd (int min, int max) { this->min = min; this->max = max; if(!Rnd::seeded) { Rnd::seed(); } } int Rnd::next () { double d = rand () / (RAND_MAX+1.0); return ((int) (d * (max-min+1))) + min; } void Rnd::seed () { seed((unsigned int) time (NULL)); } void Rnd::seed (unsigned int seed) { srand (seed); Rnd::seeded = true; } boolean Rnd::seeded = false; Ultima modifica di cionci : 12-07-2007 alle 18:08. |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
cionci, ottima idea!
![]() Così non ci si deve preoccupare di impostare il seed esplicitamente.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 08:21.