Torna indietro   Hardware Upgrade Forum > Software > Programmazione

ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondono completezza e duttilità
ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondono completezza e duttilità
NUC 15 Pro e NUC 15 Pro+ sono i due nuovi mini-PC di casa ASUS pensati per uffici e piccole medie imprese. Compatti, potenti e pieni di porte per la massima flessibilità, le due proposte rispondono in pieno alle esigenze attuali e future grazie a una CPU con grafica integrata, accompagnata da una NPU per la gestione di alcuni compiti AI in locale.
Cybersecurity: email, utenti e agenti IA, la nuova visione di Proofpoint
Cybersecurity: email, utenti e agenti IA, la nuova visione di Proofpoint
Dal palco di Proofpoint Protect 2025 emerge la strategia per estendere la protezione dagli utenti agli agenti IA con il lancio di Satori Agents, nuove soluzioni di governance dei dati e partnership rafforzate che ridisegnano il panorama della cybersecurity
Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti
Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti
Dopo alcuni anni di assenza dai cataloghi dei suoi televisori, Hisense riporta sul mercato una proposta OLED che punta tutto sul rapporto qualità prezzo. Hisense 55A85N è un televisore completo e versatile che riesce a convincere anche senza raggiungere le vette di televisori di altra fascia (e altro prezzo)
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 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
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 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
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 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.
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 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
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 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.
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 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
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 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
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


ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondono completezza e duttilità ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondo...
Cybersecurity: email, utenti e agenti IA, la nuova visione di Proofpoint Cybersecurity: email, utenti e agenti IA, la nuo...
Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti Hisense A85N: il ritorno all’OLED è convi...
Acer TravelMate P6 14 AI: il Copilot+ PC sotto il chilo per il professionista in movimento Acer TravelMate P6 14 AI: il Copilot+ PC sotto i...
Recensione Borderlands 4, tra divertimento e problemi tecnici Recensione Borderlands 4, tra divertimento e pro...
Tante novità in arrivo per OnePlu...
Novità per la smarthome da EZVIZ....
Intel SGX e AMD SEV-SNP aggirabili su pi...
Autovelox, parte il censimento ufficiale...
Adobe Premiere arriva su iPhone: l'app &...
Il Cybertruck di Tesla non può es...
Windows 11 25H2 è stato appena ri...
VMware, con la versione 9 di Cloud Found...
Area B e C Milano, stop alle auto benzin...
Huawei FreeBuds 7i arrivano in Italia: c...
Offerte Amazon Fire TV: smart TV per ogn...
iPhone 11 Pro Max e Apple Watch Series 3...
Toyota ha venduto solo 18 elettriche ad ...
Tutti i Ring in promo Amazon: videocitof...
Taiwan respinge la richiesta USA di tras...
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: 11:30.


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