|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Jul 2012
Messaggi: 29
|
PROBLEMA numeri casuali che non si ripetono nella stessa ruota
Ciao a tutti
#include <cstdlib> #include <iostream> using namespace std; const int max_numeri=5; const int max_citta=11; string citta[max_citta]={"Bari","Cagliari","Firenze","Genova","Milano","Napoli","Palermo","Roma","Torino","Venezia","Nazionale"}; int numeri[max_numeri]; int giocoEstrazioni(int numero) { int numeri; srand (time(NULL)); for(int j=0; j<max_citta; j++){ cout<<endl<<citta[j]<<" \t"; for(int i=0; i<max_numeri; i++){ numeri=rand()%90+1; cout<<" \t"<<numeri; } } cout<<endl; } int main(int argc, char *argv[]) { int numero; giocoEstrazioni(numero); system("PAUSE"); return EXIT_SUCCESS; } ma mi succede che in una stessa ruota mi escono due numeri uguali..c'è un soluzione che non lo fa succedere? grazie scusate
Ultima modifica di neski : 13-07-2012 alle 15:21. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
|
Devi tener traccia dei numeri che estrai memorizzandoli da qualche parte. Quando estrai i successivi, controlla che il nuovo numero non sia già uscito.
__________________
CPU Ryzen 2600 @ 3,95Ghz + Bequiet Dark Rock TF / MB Asus X470-F Gaming / RAM 2x8GB DDR4 G.Skill FlareX 3200 CL14 / VGA Sapphire RX 7900 XT Nitro+ @ 3200Mhz / SSD Samsung 970 Pro 512GB + Sandisk 240GB Plus + Sandisk 960GB Ultra II PSU Seasonic Platinum P-660 / Headset Kingston HyperX Flight |
|
|
|
|
|
#3 |
|
Junior Member
Iscritto dal: Jul 2012
Messaggi: 29
|
grazie mille
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
|
Sono un po' arruginito di c/c++.
Comunque una cosa molto semplice del genere, dichiarando un array di interi di lunghezza max_numeri (sia per esempio numeri[], che ho visto dichiari all'inizio ma non mi pare che usi...) e cambiando il nome della variabile int numeri in int numero (cattiva abitudine dare nomi uguali a variabili che funzionano in modo diverso, array e primitivo in questo caso) e sostituendo queste righe: Codice:
for(int i=0; i<max_numeri; i++){
numeri=rand()%90+1;
cout<<" \t"<<numeri;
}
Codice:
//azzero l'array, 0 non può uscire quindi va bene per quello che fai dopo
for (int j=0; j<max_numeri; j++)
numeri[j]=0;
for(int i=0, int j=0; i<max_numeri; i++){
numero=rand()%90+1;
//controllo che non sia già stato estratto
for (j=0; j<max_numeri; j++)
if (numeri[j] == numero)
break; //esce dal ciclo di controllo perchè trova un doppione, j avrà un valore inferiore a max_numeri
if (j<max_numeri) //trovato un doppione
continue; //non stamparlo a video, estraine un altro
cout<<" \t"<<numero;
}
__________________
CPU Ryzen 2600 @ 3,95Ghz + Bequiet Dark Rock TF / MB Asus X470-F Gaming / RAM 2x8GB DDR4 G.Skill FlareX 3200 CL14 / VGA Sapphire RX 7900 XT Nitro+ @ 3200Mhz / SSD Samsung 970 Pro 512GB + Sandisk 240GB Plus + Sandisk 960GB Ultra II PSU Seasonic Platinum P-660 / Headset Kingston HyperX Flight |
|
|
|
|
|
#5 |
|
Junior Member
Iscritto dal: Jul 2012
Messaggi: 29
|
grazie la spiegazione seo stato molto chiaro,però guarda mi da sempre dei doppi non capisco come mai...
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
|
edit: ma no dai che pirla che sono. Manca l'inserimento nell'array
prova così Codice:
//azzero l'array, 0 non può uscire quindi va bene per quello che fai dopo
for (int j=0; j<max_numeri; j++)
numeri[j]=0;
for(int i=0, int j=0; i<max_numeri; i++){
numero=rand()%90+1;
//controllo che non sia già stato estratto
for (j=0; j<max_numeri; j++)
if (numeri[j] == numero || numeri[j] == 0)
break; //esce dal ciclo di controllo perchè trova un doppione o un elemento non inizializzato, j avrà un valore inferiore a max_numeri
if (j<max_numeri && numeri[j] == 0)
numeri[j] = numero; //inserisci il nuovo numero nell'array
else
continue; //non stamparlo a video, estraine un altro
cout<<" \t"<<numero;
}
__________________
CPU Ryzen 2600 @ 3,95Ghz + Bequiet Dark Rock TF / MB Asus X470-F Gaming / RAM 2x8GB DDR4 G.Skill FlareX 3200 CL14 / VGA Sapphire RX 7900 XT Nitro+ @ 3200Mhz / SSD Samsung 970 Pro 512GB + Sandisk 240GB Plus + Sandisk 960GB Ultra II PSU Seasonic Platinum P-660 / Headset Kingston HyperX Flight Ultima modifica di demos88 : 13-07-2012 alle 19:40. |
|
|
|
|
|
#7 |
|
Junior Member
Iscritto dal: Jul 2012
Messaggi: 29
|
eh no ancora niente......
|
|
|
|
|
|
#8 |
|
Junior Member
Iscritto dal: Jul 2012
Messaggi: 29
|
nessuno?....
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
|
lol è diventata una questione di principio per me ormai xD
ho bootato con ubuntu e compilato con code blocks. Allora, la funzione come te l'ho postata io mi da un errore di compilazione che ho risolto scrivendo int i=0,j=0 nel for anzichè int i=0, int j=0 L'ho provato e funziona tranquillamente, ho impostato il numero di valori possibili a 10 anzichè 90 per alzare le probabilità di doppioni e non ne vedo nemmeno uno. Ovviamente stiamo intendendo doppioni all'interno della stessa ruota vero? A scanso di equivoci, riporto per intero la funzione: Codice:
int giocoEstrazioni(){
int numero;
srand (time(NULL));
for(int j=0; j<max_citta; j++){
cout<<endl<<citta[j]<<" \t";
//azzero l'array, 0 non può uscire quindi va bene per quello che fai dopo
for (int j=0; j<max_numeri; j++)
numeri[j]=0;
for(int i=0,j=0; i<max_numeri; i++){
numero=rand()%90+1;
//controllo che non sia già stato estratto
for (j=0; j<max_numeri; j++)
if (numeri[j] == numero || numeri[j] == 0)
break; //esce dal ciclo di controllo perchè trova un doppione o un elemento non inizializzato, j avrà un valore inferiore a max_numeri
if (j<max_numeri && numeri[j] == 0)
numeri[j] = numero; //inserisci il nuovo numero nell'array
else
continue; //non stamparlo a video, estraine un altro
cout<<"\t"<<numero;
}
}
cout<<endl;
}
Se a te non va, non so più che fare xD
__________________
CPU Ryzen 2600 @ 3,95Ghz + Bequiet Dark Rock TF / MB Asus X470-F Gaming / RAM 2x8GB DDR4 G.Skill FlareX 3200 CL14 / VGA Sapphire RX 7900 XT Nitro+ @ 3200Mhz / SSD Samsung 970 Pro 512GB + Sandisk 240GB Plus + Sandisk 960GB Ultra II PSU Seasonic Platinum P-660 / Headset Kingston HyperX Flight |
|
|
|
|
|
#10 |
|
Junior Member
Iscritto dal: Jul 2012
Messaggi: 29
|
niente ancora niente non capisco come mai ci perderò la testa......grazie comunque...
|
|
|
|
|
|
#11 |
|
Junior Member
Iscritto dal: Jul 2012
Messaggi: 29
|
ah comunque con questo tuo codice non mi tira fuori dei numeri.....ci sono dei punti vuoti..
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Jul 2011
Messaggi: 381
|
Ciao, a mio avviso il codice è un po' bruttino...
Partiamo dall'inizio: Codice:
int numeri[max_numeri]; Codice:
int numeri; Codice:
int giocoEstrazioni(int numero) Codice:
int numero; giocoEstrazioni(numero); Quindi il mio consiglio è quello di utilizzare l'opzione -Wall quando compili. Passiamo ora al problema da te esposto ovvero i numeri doppi sulla stessa ruota. Riprendendo la tua funzione io farei una cosa così: Codice:
....
map<int,int> numeri;
map<int,int>::iterator it;
....
int giocoEstrazioni(int numero)
{
int estratto;
srand (time(NULL));
for(int j=0; j<max_citta; j++){
numeri.clear();
cout<<endl<<citta[j]<<" \t";
for(int i=0; i<max_numeri; i++){
estratto=rand()%90+1;
it=numeri.find(estratto);
if (it==numeri.end())
cout<<" \t"<<estratto;
else
i--;
}
}
cout<<endl;
}
E' abbastanza semplice concettualmente, sicuramente non è il massimo dell'efficienza Ciao
__________________
Concluso positivamente con: Kamzata, Ducati82, Arus, TheLastRemnant, ghost driver, alexbull1, DanieleRC5, XatiX |
|
|
|
|
|
#13 |
|
Member
Iscritto dal: Mar 2008
Messaggi: 47
|
Decisamente poco elegante e poco efficiente: ogni volta che generi un numero devi controllare di non averlo già estratto, e nel caso ripetere (anche molte volte).
Devi estrarre senza reinserimento n numeri tra quelli da 1 a 90: crea una lista di numeri da 1 a 90, mischiala casualmente e prendi i primi n (che poi è proprio come funziona realmente un'estrazione del lotto). Codice:
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdlib>
#include <ctime>
std::vector<int> estrai(const int n, const int max = 90)
{
// Crea un vettore contenente numeri da 1 a max.
std::vector<int> numbers(max);
for (int i = 1; i <= max; ++i) {
numbers[i - 1] = i;
}
// Mischia casualmente il vettore (ricordati di inizializzare generatore
// di numeri casuali con std::srand).
std::random_shuffle(numbers.begin(), numbers.end());
// Copia i primi n numeri.
std::vector<int> result(n);
std::copy(numbers.begin(), numbers.begin() + n, result.begin());
return result;
}
int main()
{
std::srand(std::time(0));
std::vector<int> result = estrai(5);
std::cout << "Results: \n";
for (std::vector<int>::const_iterator i = result.begin();
i != result.end();
++i) {
std::cout << " " << *i << '\n';
}
}
|
|
|
|
|
|
#14 |
|
Junior Member
Iscritto dal: Jul 2012
Messaggi: 29
|
l'unico codice che mi funziona è quello d bender ma non lo riesco a comprendere del tutto....in tutti i passaggi...
|
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
|
Quote:
E' concettualmente diverso. I suoi commenti mi sembrano esaustivi e il codice chiaro, riassumendo il suo codice: - crea un oggetto di tipo vector di capienza "max" numeri - nel primo ciclo for inizializza il vettore assegnando il valore n alla n-esima posizione del vettore (i + 1 è la posizione dell'elemento di indice i). In pratica hai un vettore di 90 interi ordinati dall'1 al 90. - con il metodo random_shuffle mescola il vettore - prende i primi 5 numeri del vettore e quelli sono i 5 numeri estratti, che sono casuali e sicuramente non ripetuti.
__________________
CPU Ryzen 2600 @ 3,95Ghz + Bequiet Dark Rock TF / MB Asus X470-F Gaming / RAM 2x8GB DDR4 G.Skill FlareX 3200 CL14 / VGA Sapphire RX 7900 XT Nitro+ @ 3200Mhz / SSD Samsung 970 Pro 512GB + Sandisk 240GB Plus + Sandisk 960GB Ultra II PSU Seasonic Platinum P-660 / Headset Kingston HyperX Flight Ultima modifica di demos88 : 19-07-2012 alle 14:14. |
|
|
|
|
|
|
#16 |
|
Junior Member
Iscritto dal: Jul 2012
Messaggi: 29
|
Grazie demos88 per a spiegazione molto semplice e chiara,ma stavo pensando e se semplicemente creassi solo un vettore dove salvo i 90 numeri poi come faccio a estrarli casualmente(lo so è molto simile al suo codice) così come hai detto te è impossibile che si ripetano e in più il codice sarebbe ancora più semplice...grazie in anticipo
|
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
|
Quote:
Se tu inserisci 90 numeri in un array e li vuoi estrarre casualmente hai due possibilità: - Rendi casuale l'ordine e estrai sequenzialmente come ha fatto bender. In questo caso non devi generare numeri casuali, basta che estrai i primi 5 (ma potrebbero essere anche gli ultimi 5, o 5 numeri nel mezzo dell'array, non cambia nulla). - Lasci l'array ordinato e estrai casualmente. Ma in questo caso il problema ritorna di nuovo: per estrarli casualmente devi generare indici dell'array da 1 a 90 casuali e non ripetuti, quindi non combini niente, ti riduci sempre a dover gestire la generazione di numeri casuali non ripetuti. Se vuoi usare un array da cui estrarre, l'unico modo sensato di farlo è quello di mescolarlo come ha fatto bender.
__________________
CPU Ryzen 2600 @ 3,95Ghz + Bequiet Dark Rock TF / MB Asus X470-F Gaming / RAM 2x8GB DDR4 G.Skill FlareX 3200 CL14 / VGA Sapphire RX 7900 XT Nitro+ @ 3200Mhz / SSD Samsung 970 Pro 512GB + Sandisk 240GB Plus + Sandisk 960GB Ultra II PSU Seasonic Platinum P-660 / Headset Kingston HyperX Flight |
|
|
|
|
|
|
#18 |
|
Junior Member
Iscritto dal: Jul 2012
Messaggi: 29
|
e naturalmente servono tutte le librerie che ha messo lui o alcune possono anche non essere usate?comunque grazie demos88 mi stai dando una grande mano
|
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
|
Quote:
__________________
CPU Ryzen 2600 @ 3,95Ghz + Bequiet Dark Rock TF / MB Asus X470-F Gaming / RAM 2x8GB DDR4 G.Skill FlareX 3200 CL14 / VGA Sapphire RX 7900 XT Nitro+ @ 3200Mhz / SSD Samsung 970 Pro 512GB + Sandisk 240GB Plus + Sandisk 960GB Ultra II PSU Seasonic Platinum P-660 / Headset Kingston HyperX Flight |
|
|
|
|
|
|
#20 |
|
Junior Member
Iscritto dal: Jul 2012
Messaggi: 29
|
e std:: cosa sarebbe?sta a significare che crea un vettore standard?perchè non trovo niente in rete,anche se l' ho già visto molte volte
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:52.




















