> 백엔드 개발 > C++ > Boost 라이브러리를 사용하여 가중치 난수를 어떻게 생성할 수 있습니까?

Boost 라이브러리를 사용하여 가중치 난수를 어떻게 생성할 수 있습니까?

Barbara Streisand
풀어 주다: 2024-12-20 20:14:10
원래의
807명이 탐색했습니다.

How Can I Generate Weighted Random Numbers Using the Boost Library?

Boost의 가중 난수

Boost 라이브러리는 광범위한 난수 생성 기능을 제공합니다. 간단한 난수 생성 기능을 제공하지만 가중치 난수에 대한 기본 지원은 부족합니다. 이 기사에서는 원시 Boost 함수를 사용하여 가중치 난수 선택을 구현하는 기술을 살펴봅니다.

가중 난수화 알고리즘

가중 난수를 생성하려면 다음 알고리즘을 사용할 수 있습니다.

  1. 모두 합을 계산하세요. 가중치.
  2. 0과 가중치 합계(포함) 사이의 난수를 생성합니다.
  3. 음수가 될 때까지 난수에서 가중치를 반복적으로 뺍니다. 현재 항목의 인덱스는 선택한 가중치 숫자입니다.

Boost에 적용

이 알고리즘은 다음과 같이 Boost에 적용할 수 있습니다.

using namespace boost;

int weightedRandom(const std::vector<int>& weights) {
  // Calculate the sum of weights
  int sum = accumulate(weights.begin(), weights.end(), 0);

  // Generate a random number between 0 and the sum
  variate_generator<mt19937, uniform_int_distribution<int>> rand(generator());
  int rnd = rand(sum);

  // Traverse weights and subtract until random number becomes negative
  for (size_t i = 0; i < weights.size(); ++i) {
    if (rnd - weights[i] < 0) {
      return i;
    }
    rnd -= weights[i];
  }

  // Should never reach here
  assert(false);
}
로그인 후 복사

변하지 않는 최적화 가중치

가중치가 거의 변경되지 않고 목록이 상당히 긴 경우 누적 가중치 합계를 미리 계산하고 이진 검색을 사용하여 최적화할 수 있습니다.

알 수 없는 목록 크기에 대한 저장소 샘플링

크기를 알 수 없는 목록의 경우 가중치를 적용한 저장소 샘플링을 사용할 수 있습니다.

결론

Boost에는 전용 가중치 난수 기능이 없지만 제시된 기술을 사용하면 원시 Boost 기능을 사용하여 효율적이고 정확한 생성이 가능합니다.

위 내용은 Boost 라이브러리를 사용하여 가중치 난수를 어떻게 생성할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿