Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Oltre il contante e le crypto: tutto sull'Euro Digitale e la nuova sovranità monetaria europea
Oltre il contante e le crypto: tutto sull'Euro Digitale e la nuova sovranità monetaria europea
L'euro digitale è una valuta fiat che entrerà in vigore nei prossimi anni. L'obiettivo principale è quello di ridurre la dipendenza dalle piattaforme di pagamento digitali statunitensi e offrire ai cittadini un modo semplice per trasferire denaro. Anche offline, anche in maniera (pseudo)anonima
Recensione HONOR Magic V6: spessore record e super batteria. È lui il fold da battere?
Recensione HONOR Magic V6: spessore record e super batteria. È lui il fold da battere?
HONOR Magic V6 è arrivato in Italia a 2.299,90 euro con una promessa precisa: unire 4 mm di spessore da aperto (8,75 mm chiuso nel modello White, 9 mm negli altri colori) a una batteria da 6.660 mAh, la più capiente mai vista su un pieghevole. Lo abbiamo usato per oltre una settimana in versione Red 16/512 GB per capire se lo Snapdragon 8 Elite Gen 5 tiene testa alla concorrenza anche fuori dai benchmark ufficiali
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni
Redmi Pad 2 9.7 punta su un display ampio e fluido, una batteria capace di accompagnare l'uso quotidiano senza ansie da ricarica e un prezzo accessibile, a partire da 179,90 euro per la versione con 64 GB di storage. Lo Snapdragon 6s 4G Gen 2 e i 4 GB di RAM della configurazione più diffusa frenano però chi cerca reattività e multitasking spinto: ecco il bilancio dopo due settimane di prova diretta
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 12-07-2012, 21:32   #1
neski
Junior Member
 
Iscritto dal: Jul 2012
Messaggi: 29
PROBLEMA numeri casuali che non si ripetono nella stessa ruota

Ciao a tutti avrei un problema se qualcuno magari sa cm aiutarmi aiutarmi mi farebbe un enorme favore..io ho compilato un gioco del lotto questo:
#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.
neski è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2012, 09:22   #2
demos88
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 5900X @ 4,7Ghz + Thermalright Phantom Spirit 120 SE / MB Asus X470-F Gaming / RAM 2x16GB DDR4 Corsair 3600 CL16 / VGA Sapphire RX 7900 XT Nitro+ / SSD Crucial T500 1TB + Samsung 970 Pro 512GB + Sandisk 960GB Ultra II / PSU FSP Hydro G PRO 1000W / Headset Kingston HyperX Flight
demos88 è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2012, 14:17   #3
neski
Junior Member
 
Iscritto dal: Jul 2012
Messaggi: 29
grazie mille ma riusciresti a farmi un esempio semplice semplice da capire meglio? se non ti disturbo troppo..
neski è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2012, 16:40   #4
demos88
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;
}
con
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;
}
non l'ho compilato, ho cambiato il nome di una variabile per non fare confusione. I commenti dovrebbero essere esplicativi.
__________________
CPU Ryzen 5900X @ 4,7Ghz + Thermalright Phantom Spirit 120 SE / MB Asus X470-F Gaming / RAM 2x16GB DDR4 Corsair 3600 CL16 / VGA Sapphire RX 7900 XT Nitro+ / SSD Crucial T500 1TB + Samsung 970 Pro 512GB + Sandisk 960GB Ultra II / PSU FSP Hydro G PRO 1000W / Headset Kingston HyperX Flight
demos88 è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2012, 17:51   #5
neski
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...
neski è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2012, 18:35   #6
demos88
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 5900X @ 4,7Ghz + Thermalright Phantom Spirit 120 SE / MB Asus X470-F Gaming / RAM 2x16GB DDR4 Corsair 3600 CL16 / VGA Sapphire RX 7900 XT Nitro+ / SSD Crucial T500 1TB + Samsung 970 Pro 512GB + Sandisk 960GB Ultra II / PSU FSP Hydro G PRO 1000W / Headset Kingston HyperX Flight

Ultima modifica di demos88 : 13-07-2012 alle 18:40.
demos88 è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2012, 18:50   #7
neski
Junior Member
 
Iscritto dal: Jul 2012
Messaggi: 29
eh no ancora niente......
neski è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2012, 20:11   #8
neski
Junior Member
 
Iscritto dal: Jul 2012
Messaggi: 29
nessuno?....
neski è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2012, 20:25   #9
demos88
Senior Member
 
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
Quote:
Originariamente inviato da neski Guarda i messaggi
eh no ancora niente......
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;
}
questa mi funziona, ho provato anche approcci diversi (con un loop while true perchè mi piace il while :P ) e funziona seguendo lo stesso ragionamento.
Se a te non va, non so più che fare xD
__________________
CPU Ryzen 5900X @ 4,7Ghz + Thermalright Phantom Spirit 120 SE / MB Asus X470-F Gaming / RAM 2x16GB DDR4 Corsair 3600 CL16 / VGA Sapphire RX 7900 XT Nitro+ / SSD Crucial T500 1TB + Samsung 970 Pro 512GB + Sandisk 960GB Ultra II / PSU FSP Hydro G PRO 1000W / Headset Kingston HyperX Flight
demos88 è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2012, 21:12   #10
neski
Junior Member
 
Iscritto dal: Jul 2012
Messaggi: 29
niente ancora niente non capisco come mai ci perderò la testa......grazie comunque...
neski è offline   Rispondi citando il messaggio o parte di esso
Old 14-07-2012, 10:15   #11
neski
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..
neski è offline   Rispondi citando il messaggio o parte di esso
Old 14-07-2012, 10:55   #12
starfred
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];
Non è utilizzata e crea solo confusione dato che poi dichiari la funzione giocoEstrazioni con all'interno la variabile

Codice:
int numeri;
Altra cosa:

Codice:
int giocoEstrazioni(int numero)
Viene chiamata dal main con

Codice:
int numero;
giocoEstrazioni(numero);
Tuttavia la variabile "numero" non è inizializzata, fortunatamente non viene usata all'interno della funzione giocoEstrazioni, tuttavia potrebbe portare a problemi.
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;
}
Ovviamente avendo prima "ripulito" il codice come ti ho esposto prima.

E' abbastanza semplice concettualmente, sicuramente non è il massimo dell'efficienza
Ciao
__________________
Concluso positivamente con: Kamzata, Ducati82, Arus, TheLastRemnant, ghost driver, alexbull1, DanieleRC5, XatiX
starfred è offline   Rispondi citando il messaggio o parte di esso
Old 14-07-2012, 11:52   #13
bender86
Member
 
L'Avatar di bender86
 
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';
    }
}
bender86 è offline   Rispondi citando il messaggio o parte di esso
Old 19-07-2012, 09:30   #14
neski
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...
neski è offline   Rispondi citando il messaggio o parte di esso
Old 19-07-2012, 13:12   #15
demos88
Senior Member
 
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
Quote:
Originariamente inviato da neski Guarda i messaggi
l'unico codice che mi funziona è quello d bender ma non lo riesco a comprendere del tutto....in tutti i passaggi...
Il codice di bender fa semplicemente uso di alcune classi e metodi più complessi per non dover eseguire a mano (sui vettori) le operazioni.
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 5900X @ 4,7Ghz + Thermalright Phantom Spirit 120 SE / MB Asus X470-F Gaming / RAM 2x16GB DDR4 Corsair 3600 CL16 / VGA Sapphire RX 7900 XT Nitro+ / SSD Crucial T500 1TB + Samsung 970 Pro 512GB + Sandisk 960GB Ultra II / PSU FSP Hydro G PRO 1000W / Headset Kingston HyperX Flight

Ultima modifica di demos88 : 19-07-2012 alle 13:14.
demos88 è offline   Rispondi citando il messaggio o parte di esso
Old 19-07-2012, 14:48   #16
neski
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
neski è offline   Rispondi citando il messaggio o parte di esso
Old 19-07-2012, 16:43   #17
demos88
Senior Member
 
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
Quote:
Originariamente inviato da neski Guarda i messaggi
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
L'"astuzia" del codice di bender è proprio che non ti devi curare di "estrarli casualmente" in quanto il loro ordine nell'array è già casuale di per se.
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 5900X @ 4,7Ghz + Thermalright Phantom Spirit 120 SE / MB Asus X470-F Gaming / RAM 2x16GB DDR4 Corsair 3600 CL16 / VGA Sapphire RX 7900 XT Nitro+ / SSD Crucial T500 1TB + Samsung 970 Pro 512GB + Sandisk 960GB Ultra II / PSU FSP Hydro G PRO 1000W / Headset Kingston HyperX Flight
demos88 è offline   Rispondi citando il messaggio o parte di esso
Old 19-07-2012, 16:57   #18
neski
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
neski è offline   Rispondi citando il messaggio o parte di esso
Old 19-07-2012, 18:25   #19
demos88
Senior Member
 
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
Quote:
Originariamente inviato da neski Guarda i messaggi
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
Non uso molto il C++, penso che abbia messo solo quelle servono. Puoi sempre provare a toglierne una e vedere se compila
__________________
CPU Ryzen 5900X @ 4,7Ghz + Thermalright Phantom Spirit 120 SE / MB Asus X470-F Gaming / RAM 2x16GB DDR4 Corsair 3600 CL16 / VGA Sapphire RX 7900 XT Nitro+ / SSD Crucial T500 1TB + Samsung 970 Pro 512GB + Sandisk 960GB Ultra II / PSU FSP Hydro G PRO 1000W / Headset Kingston HyperX Flight
demos88 è offline   Rispondi citando il messaggio o parte di esso
Old 19-07-2012, 18:48   #20
neski
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
neski è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Oltre il contante e le crypto: tutto sull'Euro Digitale e la nuova sovranità monetaria europea Oltre il contante e le crypto: tutto sull'Euro D...
Recensione HONOR Magic V6: spessore record e super batteria. È lui il fold da battere? Recensione HONOR Magic V6: spessore record e sup...
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni Redmi Pad 2 9.7: ampio display, economico e peso...
Peugeot Polygon Concept: ecco il futuro delle utilitarie Peugeot Polygon Concept: ecco il futuro delle ut...
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione Reno16 Pro: il compatto di OPPO punta su fotocam...
WhatsApp testa un cloud tutto suo per i ...
Un tassello dell'origine della vita scop...
Galaxy S26 Ultra, macchie rosse sul disp...
HUAWEI FreeClip 2S: miglior qualit&agrav...
Bun, IA ovunque e riscrittura in Rust: i...
Una startup cinese va oltre i nanometri,...
CORSAIR Platform:4 e Platform:4 Elevate,...
UnipolMove diventa più caro: scat...
Il CEO di Palantir: l'intelligenza artif...
CXMT come un treno: quasi raggiunta la c...
Il CEO di Microsoft invita le imprese al...
Agent 64: Spies Never Die arriverà...
Windows 11, addio pubblicità e risultati...
Due volte più resistente dell'acc...
Il litio non si comporta come pensavamo:...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 13:54.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v