Torna indietro   Hardware Upgrade Forum > Software > Programmazione

DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
Fino a 740 km WLTP con la batteria da 97,2 kWh, sospensioni che leggono la strada con una telecamera e un abitacolo da salotto parigino. La nuova DS N°7 raccoglie l'eredità della DS 7 e la porta, per la prima volta, nel mondo 100% elettrico. Ecco come è fatta, cosa offre e quanto costa.
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più
Abbiamo provato Samsung Galaxy Tab S12 Ultra nella versione 12 GB + 256 GB con tastiera, e il risultato è un tablet che in questa configurazione si comporta come un notebook con la fluidità tipica di Android. Spessore di 5,1 mm, display Dynamic AMOLED 2X da 14,6 pollici, MediaTek Dimensity 9500 e un software senza incertezze compongono un prodotto di vertice, con prezzi da 1.539 euro, frenato solo da un'autonomia nella parte bassa del confronto
Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura)
Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura)
Abbiamo provato per dieci giorni la Hyundai IONIQ 5 N, con 650 CV, 770 Nm e uno 0-100 km/h in 3,4 secondi. Il suo punto forte è N e-Shift, che simula un cambio a otto rapporti con suoni da motore termico e perfino un bang supersonico
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 12-07-2012, 22: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 15:21.
neski è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2012, 10: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, 15: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, 17: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, 18: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, 19: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 19:40.
demos88 è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2012, 19: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, 21: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, 21: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, 22: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, 11: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, 11: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, 12: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, 10: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, 14: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 14:14.
demos88 è offline   Rispondi citando il messaggio o parte di esso
Old 19-07-2012, 15: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, 17: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, 17: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, 19: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, 19: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


DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort DS N°7 E-Tense: il SUV premium made in Melfi...
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più Recensione Samsung Galaxy Tab S12 Ultra: non chi...
Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura) Hyundai IONIQ 5 N, l'elettrica che finge di esse...
CES Unveiled Milan, l'IA diventa tecnologia fondativa e il commercio torna centrale CES Unveiled Milan, l'IA diventa tecnologia fond...
 Recensione OPPO Find X10 Pro Max: un top di gamma completo con tre fotocamere da 200MP Recensione OPPO Find X10 Pro Max: un top di gam...
Il tuo Galaxy laggava nei giochi? Samsun...
Arrivano i nuovi Amazon Echo: prezzi da ...
Il nuovo pickup elettrico Ford può alime...
Opera WebAI: così l'intelligenza artific...
Copilot nella Sidebar di Edge sparisce p...
X terrorizza gli utenti con una mano gig...
Firmware UEFI, embargo saltato per error...
Android 18 limiterà le modifiche alla ru...
Silent Hill 1 Remake, nuove indiscrezion...
Keystone distrugge 18.835 hardware walle...
GTA VI potrebbe richiedere più GB...
Nokia 6300 rinasce grazie all'IA: arriva...
iPhone 18e: le prime indiscrezioni antic...
Motorola Edge 70 Neo in arrivo, un leak ...
Apple rilascia iOS 27.2 e iPadOS 27.2: n...
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: 14:29.


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