Rumah > pembangunan bahagian belakang > C++ > Bagaimana Saya Boleh Menjana Benih Rawak Teliti untuk mt19937 dalam C ?

Bagaimana Saya Boleh Menjana Benih Rawak Teliti untuk mt19937 dalam C ?

Mary-Kate Olsen
Lepaskan: 2024-12-04 06:59:13
asal
626 orang telah melayarinya

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

Penjanaan Benih Rawak Teliti untuk mt19937 dalam C

Masalah:

Jawapan terkini sering mencadangkan penggunaan dengan std::random_device untuk menyemai PRNG mt19937, yang cacat kerana ia tidak memberikan rawak yang mencukupi, boleh diramal dan boleh menggunakan PRNG dengan benih tetap.

Pembenihan Mudah Alih dan Teliti:

Pendekatan mudah alih dan teliti untuk pembenihan mt19937 melibatkan penggunaan CSPRNG, seperti:

  • Windows: sysrandom menggunakan CryptGenRandom
  • Unix-Like: sysrandom yang menggunakan /dev/urandom (atau getrandom jika tersedia pada Linux 3.17 atau lebih tinggi)
  • OpenBSD: sysrandom menggunakan getentropy

Contoh Kod:

#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);
Salin selepas log masuk

Linux Pengkhususan dengan 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
Salin selepas log masuk

Kes Khas OpenBSD:

#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
Salin selepas log masuk

Fikiran Lain:

  • Gunakan pendekatan baca/tulis tanpa buffer untuk rawak selamat secara kriptografi bait.
  • Fungsi khusus (cth., untuk Linux atau OpenBSD) boleh ditambah untuk kecekapan yang lebih baik.

Atas ialah kandungan terperinci Bagaimana Saya Boleh Menjana Benih Rawak Teliti untuk mt19937 dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan