Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Le soluzioni FSP per il 2026: potenza e IA al centro
Le soluzioni FSP per il 2026: potenza e IA al centro
In occasione del Tech Tour 2025 della European Hardware Association abbiamo incontrato a Taiwan FSP, azienda impegnata nella produzione di alimentatori, chassis e soluzioni di raffreddamento tanto per clienti OEM come a proprio marchio. Potenze sempre più elevate negli alimentatori per far fronte alle necessità delle elaborazioni di intelligenza artificiale.
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa
AWS è il principale operatore di servizi cloud al mondo e da tempo parla delle misure che mette in atto per garantire una maggiore sovranità alle organizzazioni europee. L'azienda ha ora lanciato AWS European Sovereign Cloud, una soluzione specificamente progettata per essere separata e distinta dal cloud "normale" e offrire maggiori tutele e garanzie di sovranità
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Xiaomi ha portato sul mercato internazionale la nuova serie Redmi Note, che rappresenta spesso una delle migliori scelte per chi non vuole spendere molto. Il modello 15 Pro+ punta tutto su una batteria capiente e su un ampio display luminoso, sacrificando qualcosa in termini di potenza bruta e velocità di ricarica
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 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, 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 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, 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 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.
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 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, 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 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.
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 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, 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 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, 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


Le soluzioni FSP per il 2026: potenza e IA al centro Le soluzioni FSP per il 2026: potenza e IA al ce...
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa AWS annuncia European Sovereign Cloud, il cloud ...
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto Redmi Note 15 Pro+ 5G: autonomia monstre e displ...
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione HONOR Magic 8 Pro: ecco il primo TOP del 2026! L...
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata Insta360 Link 2 Pro e 2C Pro: le webcam 4K che t...
Il remake di Assassin's Creed IV: Black ...
Tutti i robot aspirapolvere in offerta s...
Amazon Haul spinge la promo di San Valen...
Offerte hardware Amazon per l'upgrade de...
iPhone 17e dovrà fare i conti con...
Offerte Amazon sugli iPhone di ultima ge...
DJI Mini 5 Pro Combo Fly More scende a 8...
Ubisoft potrebbe licenziare ancora ma se...
Samsung Galaxy S26: un leak anticipa col...
Aetherflux e Lockheed Martin insieme per...
SpaceX sta proseguendo i test della terz...
Axiom Space ha mostrato un nuovo video d...
Realme: la trasformazione in sub-brand d...
PlayStation 6 si farà attendere: ...
BWT Alpine chiude la prima tornata di pr...
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:24.


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