[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

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!
Você copiou o código certo ?
Aqui o código está funcionando corretamente, verifique se copiou o código corretamente.
v0rtex@0fx66:~/Source/C/Aleatoriedade$ gcc geradorSenha.c -o geradorSenha
v0rtex@0fx66:~/Source/C/Aleatoriedade$ ./geradorSenha 10
=y}Sr?x9sP
[]‘s
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.
Não entendi bem o que você quis dizer.
[]‘s