2013-07-18 4 views
4

C++ 11의 랜덤 셔플 사양을 살펴보면 3 가지 기능이 있습니다.std :: shuffle의 사용과 유틸리티?

내 말은
template< class RandomIt > 
void random_shuffle(RandomIt first, RandomIt last); 

, 그 결과는 동일합니다 URNG이 (균일 한 분포) 무엇이든 보인다 : 비교

template< class RandomIt, class URNG > 
void shuffle(RandomIt first, RandomIt last, URNG&& g); 

: 내 질문의 일반적인 사용과 장점을 무엇이다 (통계적 관점에서). 내가 본 유일한 포인트는 std::shuffle이 안전하다는 것입니다. 반면에 std::random_shuffle의 과부하는 안전하지 않습니다. 그걸 확인해 줄 수 있니?

편집 : 나는 URNG가 균일 한 배포판이어야한다고 생각하지만 컴파일되지 않는 것 같습니다. 그래서 누군가가 std::shuffle의 작은 사용 예를 제공 할 수 있습니까?

주석에서 설명한 바와 같이
+0

글쎄, 처음으로 난수 생성기를 선택할 수 있습니다. 두 번째는 그렇지 않습니다. – juanchopanza

+1

결과가 동일하다고 믿기가 힘듭니다. 'std :: shuffle'을 정확히 호출하는 방법은 무엇입니까? – Xeo

+0

@Xeo, 내가 "같은"이라고 말하면 나는 "통계적으로 같은"을 의미한다. – Vincent

답변

2

std::shuffle는 난수 발생기 (또는 표준에서 말하는 엔진) 아니라 난수 분포 걸린다. 다른 난수 발생기는 이론적으로 균일 한 분포를 가지더라도 다른 특성을 갖는다.

  • 임의 또는 의사 난수 - 진정한 난수 발생기는 외부 엔트로피 소스의 일종을 사용합니다. 의사 난수 생성기 (PRNG)는 엄격하게 결정적입니다.
  • 성능 - 일부 발전기는 다른 것보다 빠릅니다.
  • 메모리 사용량 - 일부 PRNG는 다른 것보다 상태를 저장하는 데 더 많은 메모리가 필요합니다.
  • 기간 길이 - 모든 PRNG는 시작부터 동일한 순서를 반복하기 시작한 유한 기간을가집니다. 일부는 다른 것보다 훨씬 더 오래 걸립니다.
  • 임의성 품질 - pururorandom 스트림에 미묘한 (또는 그렇게 미묘하지 않은!) 패턴이 있는지를 측정하기 위해 numerous tests이 있습니다. 예를 들어, Diehard tests을 참조하십시오.
  • 스트림이 cryptographically secure인지 여부입니다. AFAIK, 표준 PRNG는 없습니다.

표준에 의해 제공되는 다른 발전기에 대한 개요는 http://en.cppreference.com/w/cpp/numeric/random을 참조하십시오.