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():
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).int gen() { std::random_device rd; std::mt19937 gen_numb(rd()); std::uniform_int_distribution<> dis(1, 6); return dis(gen_numb); }
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:
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