|
|
|
![]() |
|
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 14: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 18: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 13: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: 11:30.