Gerar Número Aleatório em C
-
Utilizar as funções
rand
esrand
para gerar números aleatórios em C -
Utilizar as funções
random
esrandom
para Gerar Número Aleatório em C -
Utilizar a função
getrandom
para gerar números aleatórios em C
Este artigo irá introduzir vários métodos de como gerar números aleatórios em C.
Utilizar as funções rand
e srand
para gerar números aleatórios em C
A função rand
implementa um gerador de números pseudo-aleatórios que pode fornecer um número inteiro na gama de [0, RAND_MAX]
, onde RAND_MAX
é 231-1 nos sistemas modernos. Note-se que o algoritmo gerador por detrás da função rand
é determinista. Por conseguinte, deve ser semeado com bits aleatórios.
A função srand
é utilizada para semear o gerador de números pseudo-aleatórios, e chamadas subsequentes a rand
irão produzir sequências inteiras aleatórias. Do lado negativo, não se espera que as implementações da função rand
produzam uniformemente bits aleatórios. Assim, a função rand
não é recomendada para ser utilizada em aplicações criptográficas altamente sensíveis. O exemplo seguinte semeia o gerador com o valor do tempo actual, o que não é uma boa fonte de aleatoriedade.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAX 100000
#define SIZE 100
#define NUMS_TO_GENERATE 10
int main() {
srand(time(NULL));
for (int i = 0; i < NUMS_TO_GENERATE; i++) {
printf("%d\n", rand() % MAX);
}
exit(EXIT_SUCCESS);
}
Resultado:
85084
91989
85251
85016
43001
54883
8122
84491
6195
54793
Utilizar as funções random
e srandom
para Gerar Número Aleatório em C
Um outro gerador de números pseudo-aleatórios disponível na biblioteca padrão C é implementado sob a função random
. Este método é o método preferido em comparação com a função random
, mas as aplicações criptográficas não devem utilizar a função random
em código sensível. A random
não aceita argumentos e retorna um número inteiro do tipo long int
na gama de [0, RAND_MAX]
. A função deve ser preferencialmente semeada com a função random
para gerar números aleatórios de qualidade relativamente boa.
Note que, tal como o exemplo anterior, utilizamos a função time
para passar o valor de tempo actual como semente, o que não é recomendado em aplicações sensíveis em termos de segurança.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/random.h>
#define MAX 100000
#define SIZE 100
#define NUMS_TO_GENERATE 10
int main() {
srandom(time(NULL));
for (int i = 0; i < NUMS_TO_GENERATE; i++) {
printf("%ld\n", random() / MAX);
}
printf("\n");
exit(EXIT_SUCCESS);
}
Resultado:
91
2019
2410
11784
9139
5858
5293
17558
16625
3069
Utilizar a função getrandom
para gerar números aleatórios em C
getrandom
é uma função específica do Linux para obter bits aleatórios que são de muito melhor qualidade do que dois métodos anteriores fornecidos. A getrandom
tem três argumentos - ponteiro void
que aponta para o buffer onde os bits aleatórios devem ser armazenados, o tamanho do buffer em bytes, e bandeiras para características especiais.
No exemplo seguinte, geramos um único inteiro não assinado, cujo endereço &tmp
é passado como buffer para armazenar bits aleatórios, e o tamanho é calculado com o operador sizeof
. A fonte de aleatoriedade a partir da qual o getrandom
recupera os bits pode ser não-inicializada em cenários raros. A chamada para a função ‘getrandom’ irá bloquear a execução do programa. Assim, a macro definição GRND_NONBLOCK
é passada como o terceiro argumento para que a função devolva imediatamente o valor de erro -1
nestes casos.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/random.h>
#include <time.h>
#define MAX 100000
#define SIZE 100
#define NUMS_TO_GENERATE 10
int main() {
unsigned int tmp;
getrandom(&tmp, sizeof(unsigned int), GRND_NONBLOCK) == -1
? perror("getrandom")
: "";
printf("%u\n", tmp);
exit(EXIT_SUCCESS);
}
934103271
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook