Genera numero casuale in C

Jinku Hu 12 ottobre 2023
  1. Usa le funzioni rand e srand per generare un numero casuale in C
  2. Usa le funzioni random e srandom per generare un numero casuale in C
  3. Usa la funzione getrandom per generare un numero casuale in C
Genera numero casuale in C

Questo articolo introdurrà diversi metodi su come generare numeri casuali in C.

Usa le funzioni rand e srand per generare un numero casuale in C

La funzione rand implementa un generatore di numeri pseudo-casuali che può fornire un numero intero nell’intervallo di [0, RAND_MAX], dove RAND_MAX è 231-1 sui sistemi moderni. Notare che l’algoritmo del generatore dietro la funzione rand è deterministico. Quindi dovrebbe essere seminato con bit casuali.

La funzione srand è usata per seminare il generatore di numeri pseudo-casuali, e le successive chiamate a rand produrranno sequenze di numeri interi casuali. Sul lato negativo, non ci si aspetta che le implementazioni rand producano bit casuali in modo uniforme. Pertanto, si sconsiglia di utilizzare la funzione rand in applicazioni altamente sensibili dal punto di vista crittografico. L’esempio seguente semina il generatore con il valore dell’ora corrente, che non è una buona fonte di casualità.

#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);
}

Produzione:

85084
91989
85251
85016
43001
54883
8122
84491
6195
54793

Usa le funzioni random e srandom per generare un numero casuale in C

Un altro generatore di numeri pseudocasuali pseudocasuali disponibile nella libreria standard C è implementato sotto la funzione random. Questo metodo è il metodo preferito rispetto al rand, ma le applicazioni crittografiche non dovrebbero utilizzare la funzione random nel codice sensibile. random non accetta argomenti e restituisce un numero intero di tipo long int nell’intervallo di [0, RAND_MAX]. La funzione dovrebbe essere preferibilmente seminata con la funzione srandom per generare numeri casuali di qualità relativamente buona.

Nota che, come nell’esempio precedente, usiamo la funzione time per passare il valore dell’ora corrente come seed, il che non è consigliato nelle applicazioni sensibili alla sicurezza.

#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);
}

Produzione:

91
2019
2410
11784
9139
5858
5293
17558
16625
3069

Usa la funzione getrandom per generare un numero casuale in C

getrandom è una funzione specifica di Linux per ottenere bit casuali di qualità molto migliore rispetto ai due metodi precedenti forniti. getrandom accetta tre argomenti: puntatore void che punta al buffer in cui devono essere memorizzati i bit casuali, la dimensione del buffer in byte e flag per funzioni speciali.

Nell’esempio seguente, generiamo un singolo intero senza segno, il cui indirizzo &tmp viene passato come buffer per memorizzare bit casuali, e la dimensione è calcolata con l’operatore sizeof. La fonte di casualità da cui il getrandom recupera i bit può essere non inizializzata in rari scenari. La chiamata alla funzione getrandom bloccherà l’esecuzione del programma. Pertanto, la definizione della macro GRND_NONBLOCK viene passata come terzo argomento affinché la funzione restituisca immediatamente il valore di errore -1 in questi casi.

#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
Autore: 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

Articolo correlato - C Operator