Heim > Backend-Entwicklung > C++ > Wie kann ich in C völlig zufällige Seeds für mt19937 generieren?

Wie kann ich in C völlig zufällige Seeds für mt19937 generieren?

Mary-Kate Olsen
Freigeben: 2024-12-04 06:59:13
Original
547 Leute haben es durchsucht

How Can I Generate Thoroughly Random Seeds for mt19937 in C  ?

Gründliche zufällige Seed-Generierung für mt19937 in C

Problem:

Aktuelle Antworten schlagen oft die Verwendung von vor. mit std::random_device zum Seeding des mt19937-PRNG, der fehlerhaft ist, da er nicht genügend Zufälligkeit bietet, vorhersehbar sein kann und möglicherweise einen PRNG mit festem Seed verwendet.

Portables und gründliches Seeding:

Ein tragbarer und gründlicher Ansatz zum Seeding von mt19937 beinhaltet die Verwendung eines CSPRNG, z als:

  • Windows: sysrandom unter Verwendung von CryptGenRandom
  • Unix-Like: sysrandom unter Verwendung von /dev/urandom (oder getrandom, falls verfügbar auf Linux 3.17 oder höher)
  • OpenBSD: sysrandom using getentropy

Codebeispiel:

#include <cstdint>
#include <cstdlib>
#include <fstream>

size_t sysrandom(void* dst, size_t dstlen);

std::uint_least32_t seed;
sysrandom(&seed, sizeof(seed));
std::mt19937 gen(seed);
Nach dem Login kopieren

Linux Spezialisierung mit getrandom:

#if defined(HAVE_GETRANDOM)
size_t sysrandom(void* dst, size_t dstlen) {
  int bytes = syscall(SYS_getrandom, dst, dstlen, 0);
  if (bytes != dstlen) {
    throw std::runtime_error("Unable to read N bytes from CSPRNG.");
  }
  return dstlen;
}
#endif
Nach dem Login kopieren

OpenBSD-Sonderfall:

#if defined(HAVE_GETENTROPY)
size_t sysrandom(void* dst, size_t dstlen) {
  int bytes = getentropy(dst, dstlen);
  if (bytes != dstlen) {
    throw std::runtime_error("Unable to read N bytes from CSPRNG.");
  }
  return dstlen;
}
#endif
Nach dem Login kopieren

Andere Gedanken:

  • Verwenden Sie einen ungepufferten Lese-/Schreibansatz für kryptografisch sicheren Zufall Bytes.
  • Spezialfunktionen (z. B. für Linux oder OpenBSD) können zur Verbesserung der Effizienz hinzugefügt werden.

Das obige ist der detaillierte Inhalt vonWie kann ich in C völlig zufällige Seeds für mt19937 generieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage