Ajude nosso projeto a se manter online.

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é?

Nenhum comentário:

Postar um comentário