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
548 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!

sumber:php.cn
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan