Generieren Zufallswerte per Würfelwurf in C++

Jay Shaw 12 Oktober 2023
  1. Erzeugen von Zufallszahlen durch Würfeln in C++
  2. Generieren Sie Zufallswerte ähnlich einem Würfelwurf mit C++
  3. Fazit
Generieren Zufallswerte per Würfelwurf in C++

Computer können keine Zahlen erraten. Jedes Mal, wenn eine Maschine eine Zufallszahl erzeugt, ist sie entweder ein Produkt einer bitweisen Operation oder eine Ableitung eines numerischen Faktors, d. h. Zeit, Sequenzen.

Das Problem bei der Verwendung der oben genannten Methoden besteht darin, dass sie dieselben Ergebnisse liefern, wenn sie oft genug wiederholt werden.

Aus diesem Grund werden herkömmliche Algorithmen, die zum Generieren von Zufallszahlen verwendet werden, für kryptografische Praktiken nicht empfohlen. Die Ergebnisse sind leicht vorherzusagen.

Bei der Vorhersage der Zufälligkeit ist das Würfeln eine ziemlich einfache Aufgabe. In diesem Artikel erfährt der Leser etwas über Zufälligkeit in Computern und wie zufällige Ergebnisse aus einem einfachen Würfelwurf mit C++ abgerufen werden können.

Erzeugen von Zufallszahlen durch Würfeln in C++

Ein Pseudozufallsgenerator ist eine Maschine, die scheinbar zufällige Zahlen erzeugt. Umgekehrt sind sie völlig vorhersehbar.

Dies liegt daran, dass herkömmliche Zufallszahlengeneratoren die Verwendung eines Seeds verwenden. Ein Seed ist, vereinfacht gesagt, eine injektive Funktion, die von einer Zeit oder einer numerischen Komponente abhängt.

Zum Beispiel die Ergebnisse, die für einen gegebenen Seed x(0) erzeugt werden, indem wiederholt eine injektive Funktion auf x(0) angewendet wird, die als f(x0) bezeichnet wird, sodass sich fn(x0) von fn-1(x0) oder fn+1(x0), wobei fn die Funktionsstruktur n mal darstellt.

Mit anderen Worten, f(x) enthält große Sprünge, die praktisch nichts mit den vorherigen zu tun haben.

Seed Using Time to Create Random Number for Dice Roll in C++

In den meisten Fällen sind die generierten Seeds vom Zeitfaktor abhängig. Das heißt, die injektive Funktion faktorisiert die aktuelle Sekunde in der Uhr.

Schauen wir uns ein Beispiel an, um es besser zu verstehen.

unsigned main_seed;

main_seed = time(0);

srand(main_seed);

Hier wird eine vorzeichenlose Variable main_seed initialisiert; Diese Variable wird verwendet, um die aktuelle Zeit zu speichern. srand() ist eine C++-Funktion, die aus dem Seed ein Ergebnis generiert.

Sobald der Seed generiert ist, kann die Funktion rand() als Seed verwendet werden, um Zufallswerte unter Verwendung einer linearen Gleichung zu generieren.

Die Verwendung des Zeitfaktors zum Abrufen unverwechselbarer Seeds scheint eine gute Praxis zu sein, es sei denn, moderne CPUs sind beteiligt, da sie Prozesse in Nanosekunden verarbeiten, was die gesamte Funktion in Bezug auf Zufälligkeit stört.

In den meisten Fällen sind die generierten Seeds vom Zeitfaktor abhängig. Das heißt, die injektive Funktion faktorisiert die aktuelle Sekunde in der Uhr.

Da die Uhr nicht so schnell ist, wie man vielleicht denkt, wird derselbe Seed mehrmals erhalten, wenn srand(time) mehrmals in einer Sekunde verwendet wird. Als Folge wird der erzeugte Satz von Zufallszahlen ähnlich sein.

Und dies könnte ein (erhebliches) Problem sein, insbesondere in Blockverschlüsselungsprogrammen. Im letzteren Fall kaufen die Leute eine anständige Anzahl von Generatoren, die auf physikalischen Echtzeitadjektiven wie Temperaturvarianz in atmosphärischen Daten usw. oder in letzter Zeit auf der Messung von Quantenbits basieren, z. B. auf dem Faktor, wie polarisierte Photonen überlagert werden .

Seed mit willkürlichen Zahlen zum Erstellen von Zufallszahlen für Würfelwürfe in C++

Das folgende Beispiel zeigt einen Pseudonummerngenerator, der Zahlen verwendet.

static unsigned long int rand_num = 2;

int rand(void)  // The ceiling limit is kept at 32767
{
  rand_num = rand_num * 113546545 + 12345;
  return (unsigned int)(rand_num / 65536) % 32768;
}

void srand(unsigned int main_seed)  // seed is stored inside variable main_seed
{
  rand_num = main_seed;
}

Eine vorzeichenlose int-Variable rand_num wird mit dem Wert 2 initialisiert. Im obigen Programm gibt es zwei Methoden - rand und srand.

Die Methode rand verkettet eine neue Zahl mit dem initialisierten Wert. Da die Obergrenze für den Seed festgelegt ist, geben der Mod von rand und die Obergrenze eine Zahl zurück, die niedriger als die Obergrenze ist.

Das von dieser Methode zurückgegebene Endergebnis wird in ein unsigned int typisiert.

Die Methode srand() übergibt den Wert von rand_num an die Seed-Variable main_seed.

Nachteile der Verwendung der oben genannten Methoden

Wie man sieht, gibt das Ausführen von srand(time(0)) oder das Nehmen beliebiger Werte für Seed immer neue Zahlen auf rand() zurück, die vom Seed abhängig sind. Aber nach ein paar Millionen wiederholen sich die Zahlen.

Die Seed steuert, welche Zufallszahlen der Reihe nach erstellt werden, d.h. srand(1) wird fast immer den gleichen Wert beim ersten Aufruf von rand() erzeugen, die gleiche Zahl beim zweiten Aufruf von rand() , usw.

Mit anderen Worten, die Ausgabe ist immer dieselbe Zufallszahl, wenn derselbe Seed vor jedem rand()-Aufruf neu gesetzt wird. Das mehrmalige Seeding mit time(0) in einer einzigen Sekunde führt also dazu, dass alle Zufallszahlen nach dem Reseeding gleich sind.

Es muss sich nach einigen Zyklen wiederholen, aber das Argument srand definiert das Muster. C++ rand ist für die Verschlüsselung ungeeignet, da die Kenntnis des Seeds einem Hacker hilft, die nächste Zahl zu schätzen.

Generieren Sie Zufallswerte ähnlich einem Würfelwurf mit C++

Dieses Programm verwendet einen zeitgenerierten Startwert, um Zufallszahlen im Bereich von 1 bis 6 zu erzeugen.

Pakete importieren

In diesem Programm werden drei Importpakete benötigt:

  1. iostream
  2. cstdlib - für Zeitfunktion und Randoperationen
  3. time - Header-Paket für Zeitfunktionen

iostream wird für Eingabe-Ausgabe-Operationen in das Programm importiert. Das andere Paket, cstdlib, wird für grundlegende Steueroperationen in C++-Programmen verwendet.

Das dritte Paket ist das time-Paket, das beim Erstellen des Seeds für das Programm verwendet wird.

Generieren Sie Werte gemäß dem Würfelwurf in C++

Ein Würfel hat 6 Einzelwerte. Die Rolle des Programms muss darin bestehen, eine zufällige natürliche Zahl innerhalb des Bereichs zu erzeugen, die sich bei nachfolgenden Würfelwürfen wiederholen kann, aber das Gesamtergebnis muss rein zufällig aussehen.

Drei Variablen werden initialisiert, um das Ergebnis zu finden. Die Variablen Boden und Decke speichern den niedrigsten und höchsten Wert des Würfels, und die Variable Ergebnis wird verwendet, um die Zufallszahl zu finden.

int outcome;
int l_limit = 1;
int h_limit = 6;

Der Endwert wird mit der Funktion rand() generiert, wodurch das Ergebnis innerhalb des oberen und unteren Bereichs begrenzt wird.

outcome = rand() % (max - min + 1) + min;

Abschließend wird die Variable roll zurückgegeben.

int outcome;
int l_limit = 1;  // floor or lower limit of a die
int h_limit = 6;  // ceiling or higher limit of a die

outcome = rand() % (h_limit - l_limit + 1) + l_limit;

return outcome;

Generieren Sie einen Seed mit Zeit und zeigen Sie die Ergebnisse an

Das Programm nimmt die aktuelle Zeit innerhalb der Funktion srand() und übergibt sie an die Funktion rand(). Die Anwendung verwendet die Funktion rand() aus der Methode Droll(), um natürliche Zahlen innerhalb der festgelegten Grenzen zu finden.

srand(time(0));

Nachdem der Seed erzeugt wurde, muss die Methode Droll() aufgerufen und das Ergebnis ausgedruckt werden.

Herkömmlicherweise werden drei Würfelwürfe immer als vollständiger Satz betrachtet. Diese Technik wird dreimal wiederholt, um die Zufälligkeit zu überprüfen.

Wir müssen die Methode Droll() in eine for-Schleife einfügen und dreimal innerhalb der print-Anweisung aufrufen. Das Endergebnis ist eine 3X3-Matrix aus Pseudozufallszahlen, die aus einem Würfelwurf generiert wird.

for (int i = 0; i < 3; i++) {
  std::cout << Droll() << " ";
  std::cout << Droll() << " ";
  std::cout << Droll() << std::endl;
}

Lassen Sie uns alles im Programm zusammenfügen und die Ergebnisse anzeigen.

#include <cstdlib>
#include <iostream>

#include "time.h"

int Droll() {
  int outcome;
  int l_limit = 1;  // floor or lower limit of a die
  int h_limit = 6;  // ceiling or higher limit of a die

  outcome = rand() % (h_limit - l_limit + 1) + l_limit;

  return outcome;
}

int main() {
  srand(time(0));
  for (int i = 0; i < 3; i++) {
    std::cout << Droll() << " ";
    std::cout << Droll() << " ";
    std::cout << Droll() << std::endl;
  }
}

Ausgabe:

3 1 2
6 1 3
4 5 4

--------------------------------
Process exited after 0.00784 seconds with return value 0
Press any key to continue . . .

Fazit

Dieser Artikel erläutert die Grundlagen von Pseudozahlengeneratoren. Die Leser haben die verschiedenen Methoden zur Generierung einer Zufallszahl und ihre Vor- und Nachteile gesehen.

Ein C++-Programm wird bereitgestellt, um die Konzepte kristallklar zu machen, wie Zufallszahlen innerhalb des Bereichs generiert werden und wie ein Würfelwurf mit einem Computerprogramm nachgeahmt werden kann.

Verwandter Artikel - C++ Random