Peršokti į turinį

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 2235 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

Recommended Posts

Sveiki, gal atsirastų žmogus, kuris nepatingėtų sukurti mini programėlę. Man reikia, kad random būdu būtų atrinktas laimėtojas, pagal tikimybę. Tarkim yra 100 procentų, ir įvedi vardą ir kiek tas žmogus turi procentų tikimybę laimėt iš to 100. Man reikia ,kad atrinktų random žmogų ir parašytų laimėtoją. (Žmogus pvz. turintis net 2 procentų tikimybę irgi turi turirėti šansų laimėti. (nebūtinai laimi tas, kurio procentas didžiausias). Tikiuosi kiek ieškojau, su random C++ kalboje negalima labai kažko blatno nuveikti. Bet noriu, kad tą procentą netgi per kalbelį galima būtų įrašyt. Gal atsiras, kuris padės man šiuo nedideliu darbeliu. Į komentarus numeskit, jeigu kažkas padarysit.

Redaguota , nario Tautedorus
Nuoroda į komentarą
Dalintis per kitą puslapį

(redaguota)
18 minutes prieš, Society parašė:

Kiek suprantu, laimi tik tas, kuris turi didžiausią tikimybę. Man toks netinka. Esmė tame, kad visi turi šansus, tik vieni didesnius, kiti mažesnius.

Redaguota , nario Simonas™
Nuoroda į komentarą
Dalintis per kitą puslapį

Štai kodas. Stengiausi pavyzdyje parodyti programos veikimą panaudojant objektus (galėjau tiesiog tikimybes paduoti std::discrete_distribution konstruktoriui), kad kodas atspindėtų kažkokį realesnį panaudojimą (nors galėjau dar sukurti ir loterijos klasę, bet čia bus užduotis tau :D). Aišku, nežinau, ar matematiškai teisingas toks įgyvendinimas, bet iš pirmo žvilgsnio atrodo, jog viskas veikia taip, kaip turėtų. Žinoma, viską rašiau ne iš galvos, naudojausi cppreference.com suteikta dokumentacija apie std::discrete_distribution. Iš techninės pusės, tai kompiliavau su MSVC kompiliatoriumi, naudodamas C++17 standartą.

#include <algorithm>
#include <iostream>
#include <map>
#include <random>
#include <string_view>
#include <vector>

class Player
{
private:
    std::string_view name_;
    double probability_;

public:
    Player(std::string_view name, double probability)
        : name_(name), probability_(probability)
    {
    }

    constexpr std::string_view name() const
    {
        return name_;
    }

    constexpr double probability() const
    {
        return probability_;
    }
};

int main()
{
    std::random_device random_device;
    std::mt19937 generator(random_device());

    std::vector<Player> players;

    players.emplace_back("Anthony", 0.03);
    players.emplace_back("Luke", 0.12);
    players.emplace_back("Ben", 0.20);
    players.emplace_back("Tommy", 0.65);

    std::vector<double> probabilities;

    // Kopijuojame žaidėjų tikimybes į tikimybių vektorių.
    std::transform(players.begin(), players.end(), std::back_inserter(probabilities),
                   [](const Player& player) { return player.probability(); });

    std::discrete_distribution<> discrete_distribution(probabilities.begin(),
                                                       probabilities.end());

    // Patikriname, ar programa veikia tinkamai, t.y. žaidėjai turi laimėti
    // tiek kartų, jog laimėjimų santykiai atitiktų tikimybes
    // vis didėjant lošimų skaičiui.
    std::map<unsigned int, unsigned int> times_players_won;
    for (unsigned int n = 0; n < 10000; ++n)
    {
        const auto index = discrete_distribution(generator);
        ++times_players_won[index];
    }
    for (const auto& player : times_players_won)
    {
        const auto index = player.first;
        const auto times_won = player.second;
        std::cout << "Player #" << index << " (" << players[index].name()
                  << ") won " << times_won << " times.\n";
    }

    std::cin.get();
}
Redaguota , nario Tautedorus
  • Teigiamai 1
Nuoroda į komentarą
Dalintis per kitą puslapį

2018-03-31 18:13, Tautedorus parašė:

Štai kodas. Stengiausi pavyzdyje parodyti programos veikimą panaudojant objektus (galėjau tiesiog tikimybes paduoti std::discrete_distribution konstruktoriui), kad kodas atspindėtų kažkokį realesnį panaudojimą (nors galėjau dar sukurti ir loterijos klasę, bet čia bus užduotis tau :D). Aišku, nežinau, ar matematiškai teisingas toks įgyvendinimas, bet iš pirmo žvilgsnio atrodo, jog viskas veikia taip, kaip turėtų. Žinoma, viską rašiau ne iš galvos, naudojausi cppreference.com suteikta dokumentacija apie std::discrete_distribution. Iš techninės pusės, tai kompiliavau su MSVC kompiliatoriumi, naudodamas C++17 standartą.


#include <algorithm>
#include <iostream>
#include <map>
#include <random>
#include <string_view>
#include <vector>

class Player
{
private:
    std::string_view name_;
    double probability_;

public:
    Player(std::string_view name, double probability)
        : name_(name), probability_(probability)
    {
    }

    constexpr std::string_view name() const
    {
        return name_;
    }

    constexpr double probability() const
    {
        return probability_;
    }
};

int main()
{
    std::random_device random_device;
    std::mt19937 generator(random_device());

    std::vector<Player> players;

    players.emplace_back("Anthony", 0.03);
    players.emplace_back("Luke", 0.12);
    players.emplace_back("Ben", 0.20);
    players.emplace_back("Tommy", 0.65);

    std::vector<double> probabilities;

    // Kopijuojame žaidėjų tikimybes į tikimybių vektorių.
    std::transform(players.begin(), players.end(), std::back_inserter(probabilities),
                   [](const Player& player) { return player.probability(); });

    std::discrete_distribution<> discrete_distribution(probabilities.begin(),
                                                       probabilities.end());

    // Patikriname, ar programa veikia tinkamai, t.y. žaidėjai turi laimėti
    // tiek kartų, jog laimėjimų santykiai atitiktų tikimybes
    // vis didėjant lošimų skaičiui.
    std::map<unsigned int, unsigned int> times_players_won;
    for (unsigned int n = 0; n < 10000; ++n)
    {
        const auto index = discrete_distribution(generator);
        ++times_players_won[index];
    }
    for (const auto& player : times_players_won)
    {
        const auto index = player.first;
        const auto times_won = player.second;
        std::cout << "Player #" << index << " (" << players[index].name()
                  << ") won " << times_won << " times.\n";
    }

    std::cin.get();
}

dekui uz pagalba

Nuoroda į komentarą
Dalintis per kitą puslapį

  • d0Se užrakino šią temą

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 2235 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

Svečias
Ši tema yra užrakinta.

Skelbimai


×
×
  • Sukurti naują...