|
|||||||
|
|
|
![]() |
|
|
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 17: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 17: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 19: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: 13:45.


















