C++에서 범위 내 난수 생성

Jinku Hu 2023년10월12일
  1. C++ 11<random>라이브러리를 사용하여 범위 내 난수 생성
  2. rand 함수를 사용하여 범위 내 난수 생성
C++에서 범위 내 난수 생성

이 기사에서는 지정된 숫자 간격으로 난수를 생성하는 방법에 대한 여러 C++ 메서드를 소개합니다.

C++ 11<random>라이브러리를 사용하여 범위 내 난수 생성

C++는 새로운 헤더<random>아래에 C++ 11 릴리스로 난수 생성을위한 표준 라이브러리 기능을 추가했습니다. <random>헤더에서 제공하는 RNG 워크 플로우 기능은 랜덤 엔진과 배포의 두 부분으로 나뉩니다. 랜덤 엔진은 예측할 수없는 비트 스트림을 반환합니다. 분포는 특정 확률 분포를 만족하는 난수 (사용자가 지정한 유형)를 반환합니다. 균일, 정상 또는 기타.

처음에 사용자는 시드 값으로 랜덤 엔진을 초기화해야합니다. 비 결정적 랜덤 비트에 대한 시스템 별 소스 인std::random_device로 엔진을 시드하는 것이 좋습니다. 이를 통해 엔진은 각 실행에서 서로 다른 임의의 비트 스트림을 생성 할 수 있습니다. 반면에 사용자가 여러 프로그램 실행에서 동일한 시퀀스를 생성해야하는 경우 임의 엔진은 상수int 리터럴로 초기화해야합니다.

다음으로, 분포 객체는 난수가 생성되는 간격에 대한 최소/최대 값의 인수로 초기화됩니다. 다음 예에서는uniform_int_distribution을 사용하고 임의로 콘솔에 10 개의 정수를 출력합니다.

#include <iostream>
#include <random>

using std::cout;
using std::endl;

constexpr int MIN = 1;
constexpr int MAX = 100;

constexpr int RAND_NUMS_TO_GENERATE = 10;

int main() {
  std::random_device rd;
  std::default_random_engine eng(rd());
  std::uniform_int_distribution<int> distr(MIN, MAX);

  for (int n = 0; n < RAND_NUMS_TO_GENERATE; ++n) {
    cout << distr(eng) << "; ";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

출력 (* 무작위) :

57; 38; 8; 69; 5; 27; 65; 65; 73; 4;

<random>헤더는 서로 다른 알고리즘 및 효율성 절충안을 가진 여러 임의 엔진을 제공합니다. 따라서 다음 코드 샘플과 같이 특정 임의 엔진을 초기화 할 수 있습니다.

#include <iostream>
#include <random>

using std::cout;
using std::endl;

constexpr int MIN = 1;
constexpr int MAX = 100;

constexpr int RAND_NUMS_TO_GENERATE = 10;

int main() {
  std::random_device rd;
  std::mt19937 eng(rd());
  std::uniform_int_distribution<int> distr(MIN, MAX);

  for (int n = 0; n < RAND_NUMS_TO_GENERATE; ++n) {
    cout << distr(eng) << "; ";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

출력 (* 무작위) :

59; 47; 81; 41; 28; 88; 10; 12; 86; 7;

rand 함수를 사용하여 범위 내 난수 생성

rand함수는 C 표준 라이브러리의 일부이며 C++ 코드에서 호출 할 수 있습니다. 고품질 난수 생성을 위해rand 함수를 사용하는 것은 권장되지 않지만 다양한 목적을 위해 임의의 데이터로 배열 또는 행렬을 채우는 데 사용할 수 있습니다. 이 예에서 함수는 0과 MAX숫자 간격 사이의 임의의 정수를 생성합니다. 이 함수는 std::srand(바람직하게는 현재 시간을 std::time(nullptr)로 전달)로 시드하여 여러 실행에 걸쳐 다른 값을 생성해야합니다. 그런 다음에 만 rand를 호출 할 수 있습니다.

#include <ctime>
#include <iostream>
#include <random>

using std::cout;
using std::endl;

constexpr int MIN = 1;
constexpr int MAX = 100;

constexpr int RAND_NUMS_TO_GENERATE = 10;

int main() {
  std::srand(std::time(nullptr));
  for (int i = 0; i < RAND_NUMS_TO_GENERATE; i++) cout << rand() % MAX << "; ";
  cout << endl;

  return EXIT_SUCCESS;
}

출력 (* 무작위) :

36; 91; 99; 40; 3; 60; 90; 63; 44; 22;
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

관련 문장 - C++ Random