>백엔드 개발 >C++ >C에서 mt19937에 대해 완전히 무작위 시드를 생성하려면 어떻게 해야 합니까?

C에서 mt19937에 대해 완전히 무작위 시드를 생성하려면 어떻게 해야 합니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-04 06:59:13508검색

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

C에서 mt19937에 대한 철저한 무작위 시드 생성

문제:

최근 답변에서는 종종 충분한 무작위성을 제공하지 않기 때문에 결함이 있는 mt19937 PRNG를 시드하기 위해 std::random_device를 사용하여 예측할 수 있으며 고정 시드가 있는 PRNG를 사용할 수 있습니다.

이동 가능하고 철저한 시딩:

mt19937 시드에 대한 이식 가능하고 철저한 접근 방식에는 CSPRNG를 사용하는 것이 포함됩니다. 예:

  • Windows: CryptGenRandom을 활용하는 sysrandom
  • Unix 계열: /dev/urandom을 활용하는 sysrandom(또는 사용 가능한 경우 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

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

기타 생각:

  • 암호화된 무작위 보안을 위해 버퍼링되지 않은 읽기/쓰기 접근 방식을 사용합니다. bytes.
  • 특수 기능(예: Linux 또는 OpenBSD용)을 추가하여 효율성을 높일 수 있습니다.

위 내용은 C에서 mt19937에 대해 완전히 무작위 시드를 생성하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.