Mandar um cafézinho para o programador:


Me ajude a transformar café em código!
Mostrando postagens com marcador Números aleatórios. Mostrar todas as postagens
Mostrando postagens com marcador Números aleatórios. Mostrar todas as postagens

Como gerar vários números aleatórios inteiros em C++

Você já deve ter aprendido a gerar números aleatórios usando as funções rand(), srand() e time():
https://www.cmmprogressivo.net/2019/12/Como-Gerar-Numeros-Aleatorios-Randomicos-rand-srand.html

Porém, experimente aplicar um LOOPING e gerar várias vezes, de maneiras seguidas: vai dar problema, vai dar o mesmo número!

A solução com rand() é recomendada se você for gerar somente uma vez um número aleatório, ou com espaçamento de vários segundos, entre uma geração e outra.

Para gerar vários números seguidos, até milhões, recomendamos usar a library random, da seguinte maneira:
#include <iostream>
#include <iomanip>
#include <random>
using namespace std;

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

    return dis(gen);
}

int main()
{
    int aux;

    for(aux=0 ; aux<1000 ; aux++)
        cout<<gen_number()<<endl;

    return 0;
}
Note que vai gerar números de 1 até 6 (simulando um lançamento de dados, por exemplo).
Se quiser outros intervalos, basta alterar o (1,6) para um range que você deseja.

Referência: https://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution

Lista de Exercícios de Funções em C++ (Resolvidos e comentados)

Chegamos ao final de mais uma seção de nosso curso de C++, a de funções.
Nos exercícios abaixo, você deve usar todos seus conhecimentos aprendidos até aqui, como o básico, de laços, loopings, testes condicionais e, claro, de função.

Use e abuse das funções. Crie muitas funções.
Cada função deve fazer uma única coisa, da maneira mais simples e direta possível.

Faça com que elas sejam facilmente acopladas, ou seja, deve receber e retornar informações, sempre que possível. Isso permite que você possa usar os códigos de suas funções posteriormente.

Lembre-se: um programa grande nada mais é que uma série de programinhas pequenos.
Suas funções devem ser esses programinhas pequenos, fazendo funcionalidades específicas, ok?

Exercícios de Função em C++

01. Crie um programa que recebe dois lados menores de um triângulo retângulo e uma função retorna o valor da hipotenusa.

02. Crie um programa que recebe os três lados de um triângulo, passa esses valores para uma função que diz se esse triângulo existe ou não (pela condição da existência do triângulo, cada lado deve ser maior que o módulo da subtração dos outros dois lados e deve ser menor que a soma dos outros dois lados)

03. Faça um programa que peça um número inteiro positivo 'n' para o usuário e imprima um quadrado de lado 'n' preenchido de hashtags. Por exemplo, para n=4, deve aparecer na tela:
####
####
####
####

04. Programe um software que recebe três números, para para uma função e ela retorna o maior deles. Faça outra função que recebe os mesmos números e retorna o menor deles.

05. Um número é dito ser perfeito quando ele é igual a soma de seus divisores.
Por exemplo, o seis é perfeito, pois: 6 = 1 + 2 + 3
Programa um software que pede um número ao usuário e diga se ele é perfeito ou não.

06. Crie um software que recebe um número do usuário, passa esse valor para uma função e ela retorna esse número escrito ao inverso. Por exemplo, você deu o valor 1234, então ele vai retornar 4321. Dica: primeiro, crie uma função que conta quantos dígitos tem um número.

07. Faça um programa para lançar uma moeda. Quando chamamos uma função, ela deve retorna cara ou coroa. Em outra função, faça 'n' lançamentos de moedas, 'n' é o valor que o usuário quiser, e mostre a porcentagem de vezes que deu cara e coroa. Se você jogar a moeda 10, 100, 1000, um milhão de vezes...o que tende a acontecer?

08. Crie um dado em C++. Role o dado: ou seja, uma função deve sortear um número aleatório de 1 até 6. Agora, faça com que o dado anterior seja lançado 100 vezes, mil vezes e 1 milhão de vezes. A cada vez que ele rodar, você deve armazenar o valor que ele forneceu, ao final, você mostra quantas vezes cada número foi sorteado. Bate com os resultados da estatística ?

09. Crie um jogo de par ou ímpar. Você deve escolher 0 para par ou 1 para ímpar, em seguida fornece um número. O computador gera um número de 0 até 10, soma os valores e diz quem ganhou, além de mostrar o placar e perguntar se quer jogar mais uma rodada.
Como fazer o jogo Par ou Ímpar em C++

10. Aos moldes do jogo par ou ímpar, crie o jogo do Pedra, Papel ou Tesoura, em C++.

11. Crie um jogo onde o computador sorteia um número de 1 até 10, e você tenta adivinhar qual é.

12. Vamos incrementar o jogo anterior? Faça com que o programa diga dizer quantas tentativas você levou para acertar. Faça com o que o computador sorteie um número de 1 até 100. A cada vez que você chutar, ele deve dizer se você chutou abaixo do valor real, acima ou se acertou. Ao final, diz o número de tentativas que você teve e se bateu o record ou não. Ah, ao final de cada rodada, o programa pergunta se você quer jogar novamente ou não, exibindo o record atual.

Números Aleatórios em C++: Como gerar com rand() e srand()

Neste tutorial de nossa apostila C++ Progressivo, vamos aprender como gerar números ou qualquer intervalo de números aleatórios, ou randômicos.

Números aleatórios com a Função rand()

Em muuuuuitos programas, será necessário termos números aleatórios.
Por exemplo, para sortear uma música no seu player, para escolher um vídeo aleatório do Youtube, para fazer um sorteio com seguidores do Instagram, para escolher um local no mapa do game que você criou em C++, e etc etc etc.

A primeira maneira que temos de fazer isso, é usando a função rand(), da biblioteca cstdlib.
Ele vai gerar um número entre 0 e a constante RAND_MAX.

Primeiro, vamos ver o valor desse RAND_MAX, que pode variar de máquina para máquina:
#include <iostream>
#include <cstdlib>
using namespace std;

int main()
{
    cout<<"Intervalo: 0 - "<<RAND_MAX<<endl;

    return 0;
}
Na minha máquina o resultado do programa anterior foi 2147483647.
E no seu PC?

Agora vamos gerar um número aleatório:
#include <iostream>
#include <cstdlib>
using namespace std;

int main()
{
    cout<<rand()<<endl;

    return 0;
}
Agora vamos gerar 6 números aleatórios:
#include <iostream>
#include <cstdlib>
using namespace std;

int main()
{
    int i;

    for(i=0 ; i<6 ; i++)
        cout<<rand()<<" ";

    return 0;
}
Notou algo?
Feche seu programa. Abra de novo...notou algo?

Sim, os números aleatórios se repetem! Mas, calma, vamos ver como resolver isso.

A função srand() e as sementes (seed) randômicas

Na verdade verdadeira, aquele que vem do coração, não existe número puramente aleatório. Existe toda uma ciência, e estudos e mais estudos e pesquisas em cima disso.

Basicamente, alguma regra vai ter que ser usada para gerar esses números, que na verdade são pseudoaleatórios. Porém, existe uma maneira de contornar isso.

É fornecendo números, nós mesmos, para que o C++ pegue esses valores e gere números diferentes, a partir deles. Para isso, vamos usar a função srand(), que aceita um inteiro como parâmetro (um unsigned int, na verdade).

Por exemplo, faça:
#include <iostream>
#include <cstdlib>
using namespace std;

int main()
{
    srand(2112);
    cout<<rand()<<endl;

    return 0;
}
Veja que agora o valor da rand() mudou, não era mais aqueles que ficavam repetindo.
Agora vai gerar outros 'aleatórios', pois fornecemos 2112 como semente. Mas se você fechar e abrir o programa, vai notar que vai aparecer o mesmo 'aleatório'.

Tente isso agora:
#include <iostream>
#include <cstdlib>
using namespace std;

int main()
{
    int i;

    for(i=1 ; i<=10 ; i++){
        srand(i);
        cout<<rand()<<endl;
    }

    return 0;
}
Agora deu tudo diferente, pois a cada iteração a semente que alimentou a srand() era diferente.
Mas mesmo assim, se você fechar e abrir de novo, vai dar tudo igual de novo, que saco...

A função time() da biblioteca ctime

Veja como os programadores são geniais.

Existe uma função, da biblioteca ctime, a time(), que quando invocada retorna o número de segundos desde 00:00 de 1 de Janeiro de 1970. A sacada é usar ela como geradora de sementes, pra srand().

Veja:
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
    unsigned seed = time(0);

    srand(seed);
    cout<<rand()<<endl;

    return 0;
}
Abra e feche...várias vezes...sempre diferente agora, o número sorteado!
Afinal, a cada segundo o retorno da time(0) é diferente, gerando sementes diferentes pra srand(), que altera a rand(), que nos fornece números aleatórios diferentes! PIMBA!

Escolhendo intervalos de valores
1443561896
1944127442
107792574
1300800110
...
Que diachos de valores são esses? Muito grandes...raramente vamos querer gerar números desse tamanho. Queremos aleatórios que sejam 0 ou 1...de 1 até 6...de 1 até 60...entre 0 e 100...coisa assim, concorda?

Isso é facilmente resolvido com o operador resto da divisão: %

Por exemplo, para:
  • Gerar aleatórios que sejam 0 ou 1
Basta fazer: rand()%2
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
    unsigned seed = time(0);

    srand(seed);
    cout<<rand()%2<<endl;

    return 0;
}
  • Gerar aleatórios de 1 até 10
Usando rand() % 10: ele vai gerar os números: 0, 1, 2, 3, 4, 5, 6, 7, 8 ou 9
Então, basta somar 1, e temos números de 1 até 10.
Gerando números de 1 até 10:
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
    unsigned seed = time(0);

    srand(seed);
    cout<<1+rand()%10<<endl;

    return 0;
}
Bacana, né?

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