Erzeugen einer Zufallszahl in C
-
Verwenden Sie die Funktionen
rand
undsrand
, um eine Zufallszahl in C zu erzeugen -
Verwendung der Funktionen
random
undsrandom
zum Erzeugen von Zufallszahlen in C -
Verwendung der Funktion
getrandom
zum Erzeugen von Zufallszahlen 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
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