수색…
비고
C ++의 난수 생성은 <random>
헤더에 의해 제공됩니다. 이 헤더는 무작위 장치, 의사 무작위 생성기 및 배포를 정의합니다.
무작위 장치는 운영 체제에서 제공 한 임의의 숫자를 반환합니다. 의사 랜덤 생성기의 초기화 또는 암호화 목적을 위해 직접 사용해야합니다.
의사 난수 생성기는 초기 시드를 기반으로 정수 의사 난수를 반환합니다. 의사 난수 범위는 일반적으로 부호없는 유형의 모든 값에 걸쳐 있습니다. 표준 라이브러리의 모든 의사 랜덤 생성기는 모든 플랫폼에서 동일한 초기 시드에 대해 동일한 번호를 반환합니다.
배포판은 의사 랜덤 생성기 또는 무작위 장치에서 무작위 수를 소비하고 필요한 분포로 무작위 수를 생성합니다. 배포판은 플랫폼에 독립적이지 않으며 다른 플랫폼에서 동일한 초기 시드를 사용하여 동일한 생성자에 대해 다른 번호를 생성 할 수 있습니다.
진정한 무작위 값 생성기
암호화에 사용할 수있는 실제 임의 값을 생성하려면 std::random_device
로 사용해야합니다.
#include <iostream>
#include <random>
int main()
{
std::random_device crypto_random_generator;
std::uniform_int_distribution<int> int_distribution(0,9);
int actual_distribution[10] = {0,0,0,0,0,0,0,0,0,0};
for(int i = 0; i < 10000; i++) {
int result = int_distribution(crypto_random_generator);
actual_distribution[result]++;
}
for(int i = 0; i < 10; i++) {
std::cout << actual_distribution[i] << " ";
}
return 0;
}
std::random_device
는 의사 난수 값 생성기가 사용 된 것과 같은 방식으로 사용됩니다.
그러나 std::random_device
는 구현에 정의 되지 않은 소스 (예 : 하드웨어 장치)를 구현에 사용할 수없는 경우 구현 정의 된 의사 난수 엔진의 관점에서 구현 될 수 있습니다 .
이러한 구현은 entropy
멤버 함수 를 통해 가능해야하지만 (Generator가 완전히 결정적 일 때 0을 반환 함) 많은 인기있는 라이브러리 (GCC의 libstdc ++ 및 LLVM의 libc ++)는 고품질 외부 임의성을 사용하는 경우에도 항상 0을 반환합니다. .
의사 난수 생성하기
의사 난수 생성기는 이전에 생성 된 값을 기반으로 추측 할 수있는 값을 생성합니다. 다시 말해 결정 론적입니다. 진정한 난수가 필요한 상황에서 의사 난수 생성기를 사용하지 마십시오.
#include <iostream>
#include <random>
int main()
{
std::default_random_engine pseudo_random_generator;
std::uniform_int_distribution<int> int_distribution(0, 9);
int actual_distribution[10] = {0,0,0,0,0,0,0,0,0,0};
for(int i = 0; i < 10000; i++) {
int result = int_distribution(pseudo_random_generator);
actual_distribution[result]++;
}
for(int i = 0; i <= 9; i++) {
std::cout << actual_distribution[i] << " ";
}
return 0;
}
이 코드는 난수 생성기와 같은 우도를 가진 [0,9] 범위의 정수를 생성하는 분포를 생성합니다. 그런 다음 각 결과가 생성 된 횟수를 계산합니다.
std::uniform_int_distribution<T>
의 템플리트 매개 변수는 생성되어야하는 정수 유형을 지정합니다. float 또는 double을 생성하려면 std::uniform_real_distribution<T>
를 사용하십시오.
여러 배포판에 대해 생성기 사용
난수 생성기는 여러 배포에 사용할 수 있습니다.
#include <iostream>
#include <random>
int main()
{
std::default_random_engine pseudo_random_generator;
std::uniform_int_distribution<int> int_distribution(0, 9);
std::uniform_real_distribution<float> float_distribution(0.0, 1.0);
std::discrete_distribution<int> rigged_dice({1,1,1,1,1,100});
std::cout << int_distribution(pseudo_random_generator) << std::endl;
std::cout << float_distribution(pseudo_random_generator) << std::endl;
std::cout << (rigged_dice(pseudo_random_generator) + 1) << std::endl;
return 0;
}
이 예에서는 하나의 생성자 만 정의됩니다. 이후에 세 가지 다른 분포로 무작위 값을 생성하는 데 사용됩니다. rigged_dice
분포는 0과 5 사이의 값을 생성하지만, 거의 항상 발생합니다 5
기회가 발생하기 때문에, 5
인 100 / 105
.