[Programação] Números aleatórios em C + gerador de senhas em C

[Programação] Números aleatórios em C + gerador de senhas em C

Os computadores são as máquinas mais burras que existem, só entendem duas coisas, código binário (1 e 0 ) e instruções do que fazer com esse código binário (algoritmos). Então já devem ter se perguntado, como valores aleatórios são criados se o computadores não são espertos para inventar valores?

Aleatoriedade

Os computadores não conseguem seguir uma ordem simples como nos humanos seguimos “crie um valor aleatório”, isso e fácil para o nosso cérebro, mas para os computadores não é bem assim, vou deixá-los chocados com isso, mas computadores não geram valores aleatórios, eles trabalham com pseudoaleatório (ou pseudo-aleatório, maldita nova norma), sim eles utilizam uma falsa aleatoriedade.

Como assim uma false aleatoriedade?

A Wikipédia define pseudo-aleatoriedade como: “Um processo pseudoaleatório é um processo que parece ser aleatório mas não é. Sequências pseudoaleatórias tipicamente exibem aleatoriedade estatística enquanto estão sendo geradas por um processo inteiramente determinístico. Tal processo é mais fácil de se produzir do que um genuinamente aleatório, e tem o benefício de poder ser utilizado vezes seguidas para produzir exatamente os mesmos números, o que é útil para teste e correção de software.”[1]

Existem duas formas (se conhecer mais avise nos comentários), para gerar números aleatórios:

  • A partir de eventos na natureza, velocidade do vento, decaimento dos níveis de radioatividade.
  • Criando um algoritmo que quando e executado gera uma sequencia de números que parece aleatório para quem não conhece o algoritmo ou a formula usada pelo algoritmo para gerar valores aleatórios. Uma boa formula costuma ter algumas características comuns:
    • Não repetição: Não costuma repetir os valores.
    • Boa distribuição numérica: Se a fórmula está gerando números aleatórios entre 0 e 9, o número de zeros, uns, dois, etc. que ela gera devem ser aproximadamente iguais depois de um longo período de tempo.
    • Ausência de previsões: você não tem como prever qual será o próximo número, a não ser que conheça a fórmula.

Aqui está um exemplo de uma fórmula simples de número aleatório do livro “A Linguagem de Programação em C”, de Kernighan e Ritchie:

int rand()
{
    random_seed = random_seed * 1103515245 +12345;
    return (unsigned int)(random_seed / 65536) % 32768;
}

Quando programamos na linguagem C e precisamos lidar com valores aleatórios usamos as funções rand() e srand(), como a função rand(). A função rand() gera um inteiro entre 0 e RAND_MAX, com igual probabilidade de ocorrer ou seja gera uma sequência de valores que se repete igual a si própria sempre que o programa é executado. Porque, a semente da sequência é sempre a mesma, por isso o seu valor nunca muda.

Para que ela produza uma sequência diferente é necessário, mudar a seed (no protótipo acima seria a random_seed) usando a função srand(), cujo argumento inteiro (sem sinal) é a nova semente e que não retorna nenhum valor. Se se pretender uma sequência diferente, sempre que o programa é executado, e o utilizador não seja obrigado a introduzir a semente, podemos usar uma função que retorna o valor do relógio do computador em segundos (e cujo protótipo está em time.h): srand(time(NULL)).

Abaixo segue um código fonte de um gerador de senhas que desmonstra o uso das funções rand() e srand().

Código

Construir um gerador de senha e uma tarefa bastante simples, utilizando as funções rand() e srand() e a tabela ASCII :)

/*
Gerador desenhas
Desenvolvido por: Herberson da Silva Miranda
Contato: vonnatur[at]0fx66.com
*/

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

void fGerarSenha(int t);

int main(int argc, char *argv[])
{
int tamanhoDaSenha = 0;

    srand(time(NULL));      //Utilizada pela rand()

    if(argc <= 1)
    {
    printf("Sintaxe: gerador N\nSendo N igual a qtd d caracteres da senha\n");
    exit(1);
    }

    /*A string referente a qtd de digitos ser transformada em um numero inteiro.:wq
     A funcao atoi esta sendo usada para essa tarefa: recebe a string e
    transforma no inteiro equivalente */
    tamanhoDaSenha = atoi(argv[1]);

    fGerarSenha(tamanhoDaSenha);

    return 0;
}

/*Esta funcao efetua a geracao de uma senha, utilizando os recursos das funcoes srand() e rand()*/
void fGerarSenha(int t)
{
    int var,i;

    for(i=0; i<t; i++)
    {
        var = 32 + (rand() % 94); //Utiliza os caracteres da posicao 32 a 126 da tabela ASCII
        printf("%c", var);
    }
    puts("");
}

Links interessantes

QRBG – Quantum Random Bit Generator, é um gerador de valores aleatórios que utiliza principios da física quântica.

Técnicas e Algoritmos – Números aleatórios com a linguagem PHP.

Como os Computadores geram Números aleatórios – Neste artigo são apresentados uma séries de formas matemáticas para trabalhar com a geração de números aleatórios.

[]‘s

Textos Relacionados:

Deixe um Comentário

5 Comentários.

  1. Não consegui rodar esse programa no DEV C++. Está dando os seguintes erros:

    In function `void fGerarSenha(int)’:
    expected `}’ at end of input
    [Build Error] [main.o] Error 1

    valeu!

  2. nao estou a enteder perfeito ja fiz correr nao esta dar certo axoque necesito de alguns materiais porfafor se tens envie me: sou de Mocambique.

Deixe um Comentário

SEO Powered by Platinum SEO from Techblissonline