Números aleatórios

From Applied Science

Para este nível introdutório os números aleatórios não são estudados. Eles aparecem quando queremos testar programas com entradas aleatórias. Existe uma teoria matemática por trás dos algoritmos que geram números aleatórios, mas isso não é discutido numa introdução.

Como aprendemos algoritmos determinísticos em tese não há como gerar números verdadeiramente aleatórios se existe um algoritmo que obedece a uma fórmula ou regra. O que podemos fazer é gerar números pseudo-aleatórios. Há uma regra de formação dada por um algoritmo, mas os números são bastante aleatórios para servirem numa introdução. Um gerador de números pseudo-aleatórios precisa de uma semente, um número inicial para gerar uma sequência de números onde o seguinte não guarda uma relação com o anterior, exceto pelo algoritmo em si. Para cada semente diferente uma sequência diferente. Para uma mesma semente, a mesma sequência.


O que vem a seguir depende do conhecimento sobre funções e funções do tipo 'Void'


  • Um programa que simula o lançamento de uma moeda:
#include <stdio.h>
#include <stdlib.h>

int main() {

 int  cara = 0, coroa = 0, d, moeda;

 srand(9);
 for (d = 0; d < 5000; d++) {

    moeda = rand() % 2;

    if (moeda == 0)
       coroa++;

    else
       cara++;
 }

 printf("coroa: %d\ncara: %d", coroa, cara);

}

Biblioteca stdlib.h é onde estão as funções 'rand()' e 'srand()'. O fato da distribuição de caras e coroas ser mais ou menos uniforme mostra que a distribuição dos números é bastante aleatória. Poderíamos escrever uma fórmula para gerar números pseudo-aleatórios, mas teria que ser uma fórmula muito boa para obter bons resultados.

A função srand(). Ela pede um argumento para ser chamada. Qualquer número serve. Para um número escolhido a saída sempre deverá ser a mesma sequência de números pseudo-aleatórios. A chamada da função deve ser feita fora do laço, caso contrário a mesma semente entra de novo e de novo. Gerando assim o mesmo número. Lembre-se de que uma função não pode ter resultados diferentes para uma mesma entrada. Isso viola a definição matemática de uma função.

Para economizar tempo e não precisar digitar um número você pode usar #time.h, uma biblioteca que faz o número de entrada ser um número de segundos contado a partir de uma certa data. Substitua a semente "time(0)".

A função rand(). Ela não tem parâmetros. Ela "escolhe" um número gerado por srand() e gera outro no intervalo 0 até RAND_MAX. A função srand() é do tipo 'Void', enquanto rand() é do tipo 'int'. É por isso que não podemos usar srand() como um argumento para prinf(), porque srand() não devolve nada. A cada iteração do laço um valor diferente é gerado por srand(), o que garante a distribuição uniforme dos resultados entre Cara e Coroa.