Mandar um cafézinho para o programador:


Me ajude a transformar café em código!

Probabilidade e Estatística em C++: Jogando Dados

Agora que já aprendemos os conceitos básicos dos Arrays em C++, vamos ver um uso na prática deles, fazendo lançamento de dados e usando conceitos de Probabilidade e Estatística.

Lançar Dados em C++

O que vamos fazer é bem simples: vamos jogar dados, ou seja, sortear números de 1 até 6.
Vamos fazer isso 100 vezes, 1000 e 100 mil vezes.

Inicialmente, declaramos um array de nome dice, de 6 posições, do tipo inteiro, e inicializamos com valor nulo. Vamos usar um inteiro num para armazenar o número aleatório gerado.

Em seguida, para gerar os números, vamos utilizar a função gen():
int gen()
{
    std::random_device rd;
    std::mt19937 gen_numb(rd());
    std::uniform_int_distribution<> dis(1, 6);

    return dis(gen_numb);
}
Usamos uma solução mais sofisticada, pois vamos gerar milhares de números aleatórios, num curtíssimo intervalo de tempo, e para isso a rand()/srand() não servem (gerar números seguidamente).

Vamos usar a biblioteca raindon e vai retornar um inteiro entre 1 e 6, simulando um dado.
(Referência: https://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution)

Se sair 1, armazenamos na posição dice[0].
Se sair 2, armazenamos na posição dice[1].
...
Se sair 6, armazenamos na posição dice[5].

Agora, basta fazer: num = gen();
Depois: dice[num-1]++ (pois o array vai de 0 até 5)
E incrementar o índice 'num' do array em uma unidade.

Fazemos os loopings rodar, primeiro gerando os aleatórios, depois exibindo quantas vezes cada número saiu (o número 'num' saiu dice[num] vezes). Não esqueçamos de zerar os valores do array, antes de cada looping de geração de números.

Veja como fica nosso código:
#include <iostream>
#include <iomanip>
#include <random>
using namespace std;

int gen()
{
    std::random_device rd;
    std::mt19937 gen_numb(rd());
    std::uniform_int_distribution<> dis(1, 6);

    return dis(gen_numb);
}

int main()
{
    int dice[6] = {},
        num=0, aux;

    cout <<"100 lançamentos de dados:"<<endl;
    for(aux=0 ; aux<100 ; aux++){
        num = gen();
        dice[num-1]++;
    }
    for(aux=0 ; aux<6 ; aux++){
        cout<<"Numero "<<aux+1<<" saiu: "<<dice[aux]
            <<" ("<<fixed<<setprecision(2)<<100.0*dice[aux]/100<<" %)"<<endl;
    }

    cout <<"\n1000 lançamentos de dados:"<<endl;
    for(aux=0 ; aux<1000 ; aux++){
        num = gen();
        dice[num-1]++;
    }
    for(aux=0 ; aux<6 ; aux++){
        cout<<"Numero "<<aux+1<<" saiu: "<<dice[aux]
            <<" ("<<fixed<<setprecision(2)<<100.0*dice[aux]/1000<<" %)"<<endl;
    }

    cout <<"\n100000 lançamentos de dados:"<<endl;
    for(aux=0 ; aux<100000 ; aux++){
        num = gen();
        dice[num-1]++;
    }
    for(aux=0 ; aux<6 ; aux++){
        cout<<"Numero "<<aux+1<<" saiu: "<<dice[aux]
            <<" ("<<fixed<<setprecision(2)<<100.0*dice[aux]/100000<<" %)"<<endl;
    }

}
Poderíamos ter feito direto com o código: dice[ gen()-1]++
E o resultado:
Como gerar muitos números aleatórios

Segundo a teoria das probabilidades, a chance de sair algum número em um dado é de 1 em 6, ou 1/6 ou 16,67% de chances.

Note que em 100 lançamentos, o resultado é um pouco flutuante.
A medida que aumentamos o número de sorteios, as estatísticas reais vão se aproximando do resultado da teoria, por volta dos 16,67% , logo nosso método de jogar dados é cada vez mais realista e mais aleatório à medida que aumentamos o número de lançamentos.

Nenhum comentário:

Postar um comentário

Ajude o C++ Progressivo

Que tal apoiar e fazer crescer o ensino da programação no Brasil ?

Ajudar nosso país a crescer e se desenvolver cada vez mais, tecnologicamente?

Clica abaixo pra saber mais!

Apoiar o Projeto Progressivo