>백엔드 개발 >C++ >멀티스레드 C 응용 프로그램에서 고유한 난수를 어떻게 생성할 수 있습니까?

멀티스레드 C 응용 프로그램에서 고유한 난수를 어떻게 생성할 수 있습니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-13 14:24:11226검색

How Can I Generate Unique Random Numbers in Multithreaded C   Applications?

stdlib의 rand()를 사용한 멀티스레딩 및 난수 생성

멀티스레드 애플리케이션에서는 종종 각 스레드가 고유한 난수 시퀀스를 생성해야 합니다. 그러나 표준 라이브러리 함수 srand(time(0))을 사용하여 난수 생성기(RNG)를 시드하면 무작위가 아닌 결과가 발생할 수 있습니다.

스레드 안전성 문제

srand(time(0))은 의사 난수를 생성하는 데 사용되는 RNG의 내부 상태를 초기화합니다. 멀티스레드 환경에서는 여러 스레드가 동일한 RNG 상태에 동시에 액세스하여 시드 값을 공유하고 번호 시퀀스를 동일하게 만들 수 있습니다.

해결책: 스레드 안전 시드

스레드로부터 안전한 난수 생성을 보장하려면 명시적인 상태 인수를 취하는 rand_r() 함수를 사용하는 것이 좋습니다. 각 스레드에 고유한 상태 변수를 전달하면 RNG 상태를 격리하여 각 스레드가 자체 무작위 시퀀스를 생성할 수 있습니다.

대안: 스레드 안전 생성기

또는 멀티스레드 애플리케이션용으로 특별히 설계된 drand48() 함수 사용을 고려해보세요. rand()보다 더 크고 안정적인 엔트로피 소스를 제공하며 기본적으로 스레드로부터 안전합니다.

사용 예:

#include <stdlib.h>

unsigned int thread_state;

void thread_function() {
  // Seed the state for this thread
  rand_r(&thread_state);

  // Generate random numbers using the seeded state
  int random_number = rand_r(&thread_state);
}

결론:

멀티스레드 환경에서 rand()를 사용하는 경우 rand_r()과 같은 스레드로부터 안전한 함수를 사용하여 RNG를 시드하는 데 필수적입니다. 또는 drand48()과 같은 스레드로부터 안전한 난수 생성기를 사용하는 것을 고려해 보세요. 이렇게 하면 각 스레드가 고유한 난수 시퀀스를 생성하여 스레드 전체에서 동일한 숫자 문제를 방지할 수 있습니다.

위 내용은 멀티스레드 C 응용 프로그램에서 고유한 난수를 어떻게 생성할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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