Erzeugen einer Zufallszahl in C

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie die Funktionen rand und srand, um eine Zufallszahl in C zu erzeugen
  2. Verwendung der Funktionen random und srandom zum Erzeugen von Zufallszahlen in C
  3. Verwendung der Funktion getrandom zum Erzeugen von Zufallszahlen in C
Erzeugen einer Zufallszahl in C

In diesem Artikel werden verschiedene Methoden vorgestellt, wie man in C Zufallszahlen erzeugen kann.

Verwenden Sie die Funktionen rand und srand, um eine Zufallszahl in C zu erzeugen

Die Funktion rand implementiert einen Pseudo-Zufallszahlengenerator, der eine ganze Zahl im Bereich von [0, RAND_MAX] liefern kann, wobei RAND_MAX auf modernen Systemen 231-1 ist. Beachten Sie, dass der Generator-Algorithmus hinter der Funktion rand deterministisch ist. Daher sollte er mit Zufallsbits geimpft werden.

Die Funktion srand wird verwendet, um den Pseudo-Zufallszahlengenerator zu seeden, und nachfolgende Aufrufe von rand erzeugen zufällige Ganzzahlsequenzen. Nachteilig ist, dass von rand-Implementierungen nicht erwartet wird, dass sie gleichmäßig zufällige Bits erzeugen. Daher wird die Funktion rand nicht für den Einsatz in kryptografisch hochsensiblen Anwendungen empfohlen. Im folgenden Beispiel wird der Generator mit dem Wert der aktuellen Zeit geimpft, was keine gute Quelle für Zufälligkeit ist.

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

Ausgabe:

85084
91989
85251
85016
43001
54883
8122
84491
6195
54793

Verwendung der Funktionen random und srandom zum Erzeugen von Zufallszahlen in C

Ein weiterer Pseudo-Zufallszahlengenerator, der in der C-Standardbibliothek verfügbar ist, ist unter der Funktion random implementiert. Diese Methode ist die bevorzugte Methode im Vergleich zu rand, aber kryptographische Anwendungen sollten die Funktion random nicht in sensiblem Code verwenden. random nimmt keine Argumente entgegen und gibt eine Ganzzahl vom Typ long int im Bereich von [0, RAND_MAX] zurück. Die Funktion sollte vorzugsweise mit der Funktion srandom geimpft werden, um Zufallszahlen von relativ guter Qualität zu erzeugen.

Beachten Sie, dass wir, wie im vorherigen Beispiel, die Funktion time verwenden, um den aktuellen Zeitwert als Seed zu übergeben, was in sicherheitssensiblen Anwendungen nicht empfohlen wird.

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

Ausgabe:

91
2019
2410
11784
9139
5858
5293
17558
16625
3069

Verwendung der Funktion getrandom zum Erzeugen von Zufallszahlen in C

getrandom ist eine Linux-spezifische Funktion, um Zufallsbits zu erhalten, die von weitaus besserer Qualität sind als die beiden zuvor angebotenen Methoden. getrandom nimmt drei Argumente entgegen - void-Zeiger, der auf den Puffer zeigt, in dem die Zufallsbits gespeichert werden sollen, die Größe des Puffers in Bytes und Flags für spezielle Eigenschaften.

Im folgenden Beispiel wird ein einzelner unsigned Integer erzeugt, dessen Adresse &tmp als Puffer zum Speichern von Zufallsbits übergeben wird, und die Größe wird mit dem sizeof-Operator berechnet. Die Zufallsquelle, von der getrandom die Bits abruft, kann in seltenen Szenarien nicht initialisiert sein. Der Aufruf der Funktion getrandom blockiert dann die Programmausführung. Daher wird die Makrodefinition GRND_NONBLOCK als drittes Argument für die Funktion übergeben, um in diesen Fällen sofort den Fehlerwert -1 zurückzugeben.

#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

Verwandter Artikel - C Operator