컴파일러가 C ++ 0x를 지원하고이를 사용하는 것이 옵션이라면, 새로운 표준 <random>
헤더가 귀하의 요구를 충족시킬 것입니다. uniform_int_distribution
최소 및 최대 범위 (필요한 경우 포함)를 허용하는 고품질 을 가지고 있으며 다양한 난수 생성기 중에서 선택하여 해당 분포에 연결할 수 있습니다.
다음은 int
[-57, 365]에 균일하게 분포 된 백만 개의 난수를 생성하는 코드입니다 . <chrono>
성능이 중요한 관심사라고 언급 할 때 새로운 표준 기능을 사용하여 시간을 측정했습니다.
#include <iostream>
#include <random>
#include <chrono>
int main()
{
typedef std::chrono::high_resolution_clock Clock;
typedef std::chrono::duration<double> sec;
Clock::time_point t0 = Clock::now();
const int N = 10000000;
typedef std::minstd_rand G;
G g;
typedef std::uniform_int_distribution<> D;
D d(-57, 365);
int c = 0;
for (int i = 0; i < N; ++i)
c += d(g);
Clock::time_point t1 = Clock::now();
std::cout << N/sec(t1-t0).count() << " random numbers per second.\n";
return c;
}
나 (2.8GHz Intel Core i5)의 경우 다음과 같이 인쇄됩니다.
초당 2.10268e + 07의 난수.
생성자에 int를 전달하여 생성기를 시드 할 수 있습니다.
G g(seed);
나중에 int
배포에 필요한 범위를 포함하지 않는 것을 발견하면 다음 uniform_int_distribution
과 같이 변경하여 해결할 수 있습니다 (예 :) long long
.
typedef std::uniform_int_distribution<long long> D;
나중에 minstd_rand
고품질 발전기가 충분하지 않다는 것을 알게되면 쉽게 교체 할 수 있습니다. 예 :
typedef std::mt19937 G; // Now using mersenne_twister_engine
난수 생성기를 개별적으로 제어하면 난수 분포가 상당히 자유로울 수 있습니다.
또한이 분포의 첫 번째 4 개의 "모멘트"를 사용하여 (사용하지 않음) 계산 하고 분포의 품질을 정량화하기 위해 이론적 값minstd_rand
과 비교했습니다 .
min = -57
max = 365
mean = 154.131
x_mean = 154
var = 14931.9
x_var = 14910.7
skew = -0.00197375
x_skew = 0
kurtosis = -1.20129
x_kurtosis = -1.20001
( x_
접두사는 "예상"을 나타냄)