PDA

View Full Version : [C++] rand()


L-Magic
04-10-2008, 18:30
Vorrei sapere se con C++ è possibile far stampare a video 18 numeri casuali da 1 a 18( con la funzione srand(time(NULL)) ) senza che essi si ripetano, cioè ogni numero deve apparire una volta sola.

Grazie in anticipo.

cionci
04-10-2008, 18:33
Certo, è possibile, ma non con il solo uso di rand, devi crearti un algoritmo per farlo. Pensaci un po', non è difficile ;)

L-Magic
04-10-2008, 18:34
Certo, è possibile, ma non con il solo uso di rand, devi crearti un algoritmo per farlo. Pensaci un po', non è difficile ;)

Ok, grazie, immaginavo! :)

variabilepippo
04-10-2008, 18:44
Potresti fare una cosa del genere:


#include <iostream>
#include <algorithm>
#include <vector>
#include <ctime>

using namespace std;

int main (void) {
vector<int> numeri;
vector<int>::iterator it;

srand (unsigned(time(NULL)));

for (int i = 1; i <= 18; ++i)
numeri.push_back(i);

random_shuffle(numeri.begin(), numeri.end());

for (it = numeri.begin(); it != numeri.end(); ++it)
cout << *it << " ";

return 0;
}

L-Magic
04-10-2008, 18:51
Potresti fare una cosa del genere:


#include <iostream>
#include <algorithm>
#include <vector>
#include <ctime>

using namespace std;

int main (void) {
vector<int> numeri;
vector<int>::iterator it;

srand (unsigned(time(NULL)));

for (int i = 1; i <= 18; ++i)
numeri.push_back(i);

random_shuffle(numeri.begin(), numeri.end());

for (it = numeri.begin(); it != numeri.end(); ++it)
cout << *it << " ";

return 0;
}


Grazie.

Per cionci:
il tuo metodo qual era? Ci ho pensato un po' ma non ci arrivo...

variabilepippo
04-10-2008, 18:55
il tuo metodo qual era?


Non credo che l'algoritmo immaginato da Cionci fosse molto dissimile da quello proposto... Visto che hai un numero prestabilito di valori da mostrare coincidente con il numero totale degli elementi è preferibile usare il cosiddetto "shuffling". :) Un'alternativa è data dall'estrazione degli elementi e dal successivo inserimento in una struttura dati (vettore/lista/...) dopo averne verificato la presenza, ma nel tuo caso non mi sembra la scelta migliore.

Esempio:


void init_random_seq(vector<int>& numeri, int maxvalue)
{
while (numeri.size() < maxvalue){
int n = 1 + (rand() % maxvalue);
if (find(numeri.begin(), numeri.end(), n) == numeri.end())
numeri.push_back(n);
}
}


Anche se continuo a preferire la versione con random_shuffle.

cionci
04-10-2008, 19:09
Quella sopra va benissimo.

Comunque supponendo che la popolazione sia piccola:

#define N 90

char estratti[N];
srand((unsigned)time(NULL));

memset(estratti, 0, N);
int estrazioniFatte = 0;

//per l'estrazione
int x = (int)((rand() / (RAND_MAX + 1)) * (N - estrazioniFatte));
estrazioniFatte++;
for(int i = 0; i <= x; ++i)
{
x += (estratti[i]) ? 1 : 0;
}
estratti[x] = 1;

// in x c'è il numero (0-based) estratto