Esempi pratici
Dadi, mescolamenti e campionamento
Esempi pratici è una lezione C++ Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C++ Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C++ Academy include 4 lezioni in totale.
Lancio dei dadi
Un dado a sei facce è una uniform_int_distribution(1, 6) alimentata da un motore inizializzato con un seed.
#include <iostream>
#include <random>
int main() {
std::mt19937 gen(2026);
std::uniform_int_distribution<int> die(1, 6);
for (int i = 0; i < 5; ++i) std::cout << die(gen) << ' ';
std::cout << '\n';
return 0;
}Somma di due dadi
Lanciare due dadi e sommarne i risultati produce il noto intervallo da 2 a 12, con un picco a 7.
#include <iostream>
#include <random>
int main() {
std::mt19937 gen(1);
std::uniform_int_distribution<int> die(1, 6);
int total = die(gen) + die(gen);
std::cout << "two dice sum: " << total << '\n';
return 0;
}Lancio di una moneta
Una moneta equa è una bernoulli_distribution(0.5). Conteggi quante volte esce testa su molti lanci.
#include <iostream>
#include <random>
int main() {
std::mt19937 gen(7);
std::bernoulli_distribution coin(0.5);
int heads = 0;
for (int i = 0; i < 100; ++i) if (coin(gen)) ++heads;
std::cout << heads << " heads out of 100\n";
return 0;
}Mescolamento di un mazzo
std::shuffle riordina casualmente un intervallo usando il Suo motore ed è il sostituto moderno di random_shuffle, ormai rimosso.
#include <iostream>
#include <random>
#include <algorithm>
#include <vector>
int main() {
std::vector<int> cards{1, 2, 3, 4, 5};
std::mt19937 gen(3);
std::shuffle(cards.begin(), cards.end(), gen);
for (int c : cards) std::cout << c << ' ';
std::cout << '\n';
return 0;
}Scelta di un vincitore casuale
Selezioni un elemento generando un indice casuale nell'intervallo.
#include <iostream>
#include <random>
#include <vector>
#include <string>
int main() {
std::vector<std::string> names{"Ann", "Ben", "Cara", "Dan"};
std::mt19937 gen(9);
std::uniform_int_distribution<int> pick(0, names.size() - 1);
std::cout << "winner: " << names[pick(gen)] << '\n';
return 0;
}Campionamento senza reinserimento
std::sample estrae k elementi distinti da un intervallo, perfetto per una lotteria o per selezionare le domande di un quiz.
#include <iostream>
#include <random>
#include <algorithm>
#include <vector>
int main() {
std::vector<int> pool{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::vector<int> picked;
std::mt19937 gen(4);
std::sample(pool.begin(), pool.end(), std::back_inserter(picked), 3, gen);
for (int x : picked) std::cout << x << ' ';
std::cout << '\n';
return 0;
}Caratteri casuali per le password
Utilizzi una distribuzione uniforme per indicizzare un insieme di caratteri e creare una stringa casuale.
#include <iostream>
#include <random>
#include <string>
int main() {
const std::string chars = "abcdefghijklmnopqrstuvwxyz";
std::mt19937 gen(13);
std::uniform_int_distribution<int> pick(0, chars.size() - 1);
std::string pw;
for (int i = 0; i < 8; ++i) pw += chars[pick(gen)];
std::cout << pw << '\n';
return 0;
}Scelta ponderata
std::discrete_distribution seleziona gli indici in base ai pesi indicati, quindi gli esiti più comuni compaiono più spesso.
#include <iostream>
#include <random>
int main() {
std::mt19937 gen(6);
std::discrete_distribution<int> d{10, 1, 1}; // index 0 is heaviest
int counts[3] = {0};
for (int i = 0; i < 120; ++i) counts[d(gen)]++;
std::cout << counts[0] << ' ' << counts[1] << ' ' << counts[2] << '\n';
return 0;
}Simulazione di una passeggiata aleatoria
Si sposti casualmente a sinistra o a destra e tenga traccia della posizione finale: è una semplice simulazione stocastica.
#include <iostream>
#include <random>
int main() {
std::mt19937 gen(2);
std::bernoulli_distribution step(0.5);
int pos = 0;
for (int i = 0; i < 1000; ++i) pos += step(gen) ? 1 : -1;
std::cout << "final position: " << pos << '\n';
return 0;
}Lancio finché non esce un sei
Ripeta il ciclo finché non si verifica un evento per modellare una serie di prove; in questo caso, conteggi i lanci necessari per ottenere un sei.
#include <iostream>
#include <random>
int main() {
std::mt19937 gen(15);
std::uniform_int_distribution<int> die(1, 6);
int rolls = 0;
while (die(gen) != 6) ++rolls;
std::cout << "extra rolls before a six: " << rolls << '\n';
return 0;
}Generazione di dati di test
Le distribuzioni consentono di riempire rapidamente un vector con valori casuali per testare gli algoritmi.
#include <iostream>
#include <random>
#include <vector>
int main() {
std::mt19937 gen(21);
std::uniform_int_distribution<int> d(1, 50);
std::vector<int> data(5);
for (int& v : data) v = d(gen);
for (int v : data) std::cout << v << ' ';
std::cout << '\n';
return 0;
}Verifica rapida
Verifichi la Sua comprensione della casualità nelle applicazioni pratiche.
Riepilogo
Ha applicato <random> nella pratica:
- dadi, monete e vincitori tramite distribuzioni uniformi e di Bernoulli
std::shuffleper riordinare estd::sampleper estrarre senza reinserimentodiscrete_distributionper le scelte ponderate, oltre a simulazioni come le passeggiate aleatorie
Ora dispone di un kit completo di strumenti per contenitori associativi, hashing, I/O sui file e casualità in C++.
Domande Frequenti
La lezione «Esempi pratici» è gratuita?
Sì — il testo completo di «Esempi pratici» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C++ Academy, passa a CoddyKit PRO. Il corso C++ Academy include 4 lezioni in totale.
Cosa imparerò in «Esempi pratici»?
Dadi, mescolamenti e campionamento Eserciti C++ Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare C++ Academy?
Non è richiesta alcuna esperienza precedente. C++ Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.
Quanto tempo richiede la lezione «Esempi pratici»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione C++ Academy?
Sì. Ogni lezione C++ Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Generatori casuali
- Distribuzioni
- Inizializzazione corretta
- Esempi pratici