首頁 >後端開發 >C++ >如何用 C 語言為 mt19937 產生完全隨機的種子?

如何用 C 語言為 mt19937 產生完全隨機的種子?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-04 06:59:13503瀏覽

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

在C 中為mt19937 產生徹底的隨機種子

問題:

最近的答案經常建議使用使用std::random_device 來播種mt19937 PRNG,這是有缺陷的,因為它不能提供足夠的隨機性,可以預測,並且可以使用具有固定種子的 PRNG。

便攜式和徹底的播種:

一種可移植且徹底的播種mt19937 的方法涉及使用CSPRNG,例如如:

  • Windows:
  • sysrandom 利用CryptGenRandom
  • Unix-Like:
  • sysrandom 利用/dev/urandom (或getrandom,如果可用) Linux 3.17 或更高)
  • OpenBSD:利用getentropy 的sysrandom

程式碼範例:

#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);

Linux專業化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
Linux專業化getrandom:

Linux專業化getrandom:

#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

OpenBSD特殊情況:

  • 其他想法:
使用無緩衝讀取/寫入方法來實現加密安全隨機位元組。 可以新增專用函數(例如,針對 Linux 或 OpenBSD)以提高效率。

以上是如何用 C 語言為 mt19937 產生完全隨機的種子?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn