C++ Academy · Oppitunti

Käytännön esimerkkejä

Nopat, sekoitukset ja otannat

Oppitunti 4/413 vaihetta

Käytännön esimerkkejä on ilmainen C++ Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu C++ Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C++ Academy-kurssilla on yhteensä 4 oppituntia.

Nopan heittäminen

Kuusisivuinen noppa on siementämällä alustetulla generaattorilla käytettävä uniform_int_distribution(1, 6).

#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;
}

Kahden nopan summa

Kahden nopan heittäminen ja silmälukujen laskeminen yhteen tuottaa tutun arvovälin 2–12, jonka huippu on 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;
}

Kolikonheitto

Reilu kolikko on bernoulli_distribution(0.5). Laskekaa kruunien määrä monien heittojen aikana.

#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;
}

Korttipakan sekoittaminen

std::shuffle järjestää alueen alkiot satunnaiseen järjestykseen generaattoria käyttäen. Se on käytöstä poistetun random_shuffle-funktion nykyaikainen korvaaja.

#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;
}

Satunnaisen voittajan valitseminen

Valitkaa yksi alkio tuottamalla satunnainen indeksi määritellyltä alueelta.

#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;
}

Otantaa ilman palautusta

std::sample poimii alueelta k erillistä alkiota, joten se sopii erinomaisesti arvontaan tai tietovisakysymysten valintaan.

#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;
}

Salasanan satunnaiset merkit

Rakentakaa satunnainen merkkijono indeksoimalla merkistöön tasaisen jakauman avulla.

#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;
}

Painotettu valinta

std::discrete_distribution valitsee indeksit annettujen painokertoimien perusteella, joten yleiset tulokset esiintyvät useammin.

#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;
}

Satunnaiskulun simulointi

Ottakaa satunnaisesti askel vasemmalle tai oikealle ja seuratkaa lopullista sijaintia. Kyseessä on yksinkertainen stokastinen simulointi.

#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;
}

Heittäminen kuutosen saamiseen asti

Toistakaa silmukkaa, kunnes tapahtuma toteutuu, ja mallintakaa näin kokeita. Tässä lasketaan kuutosen saamiseen tarvittavien heittojen määrä.

#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;
}

Testiaineiston tuottaminen

Jakaumilla vektori voidaan täyttää nopeasti satunnaisarvoilla algoritmien testaamista varten.

#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;
}

Pikatarkistus

Testatkaa ymmärrystänne satunnaisuuden käytännön sovelluksista.

Kertaus

Sovelsitte <random>-kirjastoa käytännössä:

  • nopat, kolikot ja voittajat uniform- ja bernoulli-jakaumien avulla
  • std::shuffle alkioiden järjestyksen muuttamiseen ja std::sample otantaan ilman palautusta
  • discrete_distribution painotettuihin valintoihin sekä satunnaiskulkujen kaltaisiin simulaatioihin

Nyt käytössänne on täydellinen työkalupakki assosiatiivisiin säilöihin, hajautukseen, tiedostojen syötteeseen ja tulostukseen sekä C++:n satunnaisuuteen.

Aloita maksutta

Opi C++ tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
51
Oppitunnit
203

Usein kysytyt kysymykset

Onko oppitunti ”Käytännön esimerkkejä” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa C++ Academy-oppimispolun 3 oppituntia, myös oppitunnin “Käytännön esimerkkejä”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. C++ Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Käytännön esimerkkejä”?

Nopat, sekoitukset ja otannat Harjoittelet C++ Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni C++ Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin C++ Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”Käytännön esimerkkejä”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä C++ Academy-oppitunnilla?

Kyllä. Jokainen C++ Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Satunnaismoottorit
  2. Jakaumat
  3. Alustus oikein
  4. Käytännön esimerkkejä
← Takaisin: C++ Academy