2015 년 최신 기술에 대한 간략한 개요를 통해 Angry Shoe와 peterchen의 탁월한 답변을 보완하고 싶습니다.
좋은 선택
randutils
randutils라이브러리 (프리젠 테이션) 간단한 인터페이스와 (선언) 강력한 임의의 기능을 제공, 흥미로운 참신입니다. 프로젝트에 대한 종속성을 추가하고 새롭기 때문에 광범위하게 테스트되지 않았다는 단점이 있습니다. 어쨌든, 무료 (MIT 라이센스)이고 헤더 전용이므로 시도해 볼 가치가 있다고 생각합니다.
최소 샘플 : 다이 롤
#include <iostream>
#include "randutils.hpp"
int main() {
randutils::mt19937_rng rng;
std::cout << rng.uniform(1,6) << "\n";
}
라이브러리에 관심이 없더라도 웹 사이트 ( http://www.pcg-random.org/ )는 일반적인 난수 생성 주제와 특히 C ++ 라이브러리에 대한 흥미로운 기사를 많이 제공합니다.
Boost.Random
Boost.Random (문서) 영감 라이브러리 C++11의 <random>, 누구와 공유 많은 인터페이스. 이론적으로는 또한 외부 종속성이기는하지만 Boost현재는 "준 표준"라이브러리의 상태를 가지고 있으며, 그 Random모듈은 양질의 난수 생성을위한 고전적인 선택으로 간주 될 수 있습니다. C++11솔루션 과 관련하여 두 가지 장점이 있습니다.
- C ++ 03에 대한 컴파일러 지원 만 있으면 더 이식 가능합니다.
- 그것의
random_device좋은 품질의 파종을 제공하기 위해 사용하는 시스템 고유의 방법
유일한 작은 결점은 모듈 오퍼링 random_device이 헤더 전용이 아니라 컴파일하고 링크해야한다는 것 boost_random입니다.
최소 샘플 : 다이 롤
#include <iostream>
#include <boost/random.hpp>
#include <boost/nondet_random.hpp>
int main() {
boost::random::random_device rand_dev;
boost::random::mt19937 generator(rand_dev());
boost::random::uniform_int_distribution<> distr(1, 6);
std::cout << distr(generator) << '\n';
}
최소 샘플은 잘 작동하지만 실제 프로그램은 한 쌍의 개선 사항을 사용해야합니다.
- make
mt19937a thread_local: 생성기가 상당히 통통하고 (> 2KB) 스택에 할당되지 않는 것이 좋습니다.
mt19937둘 이상의 정수를 가진 시드 : Mersenne Twister는 큰 상태를 가지며 초기화 중에 더 많은 엔트로피의 이점을 누릴 수 있습니다.
별로 좋지 않은 선택
C ++ 11 라이브러리
가장 관용적 인 솔루션이기는하지만 <random>라이브러리는 기본적인 요구 사항에 대해서도 인터페이스의 복잡성에 대한 대가로 많은 것을 제공하지 않습니다. 결함은 다음과 std::random_device같습니다. Standard는 출력에 대해 최소한의 품질을 요구하지 않으며 ( entropy()반환하는 한 0) 2015 년 현재 MinGW (가장 많이 사용되는 컴파일러는 아니지만 심오한 선택이 거의 없음)는 항상 4최소한의 샘플에 인쇄 됩니다.
최소 샘플 : 다이 롤
#include <iostream>
#include <random>
int main() {
std::random_device rand_dev;
std::mt19937 generator(rand_dev());
std::uniform_int_distribution<int> distr(1, 6);
std::cout << distr(generator) << '\n';
}
구현이 손상되지 않은 경우이 솔루션은 Boost 솔루션과 동일해야하며 동일한 제안이 적용됩니다.
Godot의 솔루션
최소 샘플 : 다이 롤
#include <iostream>
#include <random>
int main() {
std::cout << std::randint(1,6);
}
이것은 간단하고 효과적이며 깔끔한 솔루션입니다. 결함 만, 컴파일하는 데 시간이 걸립니다. C ++ 17이 정시에 출시되고 실험 randint기능이 새로운 표준으로 승인 되면 약 2 년이 걸립니다 . 아마도 그때 쯤이면 파종 품질에 대한 보장도 향상 될 것입니다.
최소 샘플 : 다이 롤
#include <cstdlib>
#include <ctime>
#include <iostream>
int main() {
std::srand(std::time(nullptr));
std::cout << (std::rand() % 6 + 1);
}
이전 C 솔루션은 유해한 것으로 간주되며 정당한 이유가 있습니다 (여기의 다른 답변 또는 이 자세한 분석 참조 ). 그럼에도 불구하고 장점이 있습니다. 간단하고 휴대 가능하며 빠르고 정직합니다. 즉, 임의의 숫자가 거의 적절하지 않다는 것이 알려져 있으므로 심각한 목적으로 사용하려는 유혹이 없습니다.
회계 트롤 솔루션
최소 샘플 : 다이 롤
#include <iostream>
int main() {
std::cout << 9;
}
9는 일반적인 주사위 굴림에서 다소 특이한 결과이지만, 가장 빠르고 간단하며 가장 캐시 친화적이며 휴대가 간편한이 솔루션의 우수한 품질 조합에 감탄해야합니다. 9를 4로 대체하면 모든 종류의 Dungeons and Dragons 사망에 대한 완벽한 생성기를 얻을 수 있으며, 여전히 기호가 가득한 값 1, 2 및 3을 피할 수 있습니다. 유일한 작은 결점은 Dilbert의 회계 트롤의 나쁜 성질 때문에, 이 프로그램은 실제로 정의되지 않은 동작을 유발합니다.