PDA

View Full Version : [C++] Classe che genera numeri a caso


The_ouroboros
12-07-2007, 15:59
E da un po che non programmavo e oggi ho ripreso...


#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;
}

Va bene come progettazione di classe o č troppo incasinata???

andbin
12-07-2007, 16:18
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ė:
#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);
}

cionci
12-07-2007, 17:37
Io ci metterei anche qualcosa di questo tipo:
#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;

andbin
12-07-2007, 19:28
cionci, ottima idea! ;)
Cosė non ci si deve preoccupare di impostare il seed esplicitamente.