Gerar Número Aleatório em C

Jinku Hu 12 outubro 2023
  1. Utilizar as funções rand e srand para gerar números aleatórios em C
  2. Utilizar as funções random e srandom para Gerar Número Aleatório em C
  3. Utilizar a função getrandom para gerar números aleatórios em C
Gerar Número Aleatório 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
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Artigo relacionado - C Operator