플랫폼 간 일관된 의사 난수
저는 모든 플랫폼에서 주어진 시드에 대해 동일한 시퀀스 결과를 산출할 의사 난수 시퀀스를 생성하는 방법을 찾고 있습니다.나는 다음과 같이 추측합니다.rand()/srand()일관성이 없을 것입니다. (이 가정에 대해 쉽게 틀릴 수 있습니다.)
메르센 트위스터 같은 것 (부스트에서).임의)는 결정론적입니다.
Knuth는 The Art of Computer Programming의 섹션 3.6에 설명된 의사 난수 생성기에 대한 공개 도메인 C (및 FORTRAN) 소스 코드를 공개했습니다.
이것이 오래된 스레드라는 것을 깨달았지만 이제 C++11을 사용하면 다양한 새로운 옵션을 사용할 수 있습니다.다음은 페이지에서 기본적으로 다음을 사용하는 증류된 예입니다.Mersenne Twister엔진과Normal분포:
#include <iostream>
#include <iomanip>
#include <string>
#include <map>
#include <random>
int main()
{
std::random_device rd;
//
// Engines
//
std::mt19937 e2(rd());
//std::knuth_b e2(rd());
//std::default_random_engine e2(rd()) ;
//
// Distribtuions
//
std::normal_distribution<> dist(2, 2);
//std::student_t_distribution<> dist(5);
//std::poisson_distribution<> dist(2);
//std::extreme_value_distribution<> dist(0,2);
std::map<int, int> hist;
for (int n = 0; n < 10000; ++n) {
++hist[std::round(dist(e2))];
}
for (auto p : hist) {
std::cout << std::fixed << std::setprecision(1) << std::setw(2)
<< p.first << ' ' << std::string(p.second/200, '*') << '\n';
}
}
저는 이 일을 위해 도서관 일을 해요.크로스 플랫폼이 되어야 하는데, 여러 언어를 목표로 하고 있습니다.현재 C와 파이썬(양 언어에서 동일한 숫자 생성)을 지원하고 있습니다.Boost와 C++11 랜덤 API에 이어 곧 C++에도 동일한 제너레이터를 구현할 계획입니다.
구글에 빠르게 검색된 참조는 다음과 같이 말합니다.
동일한 시드를 가진 두 개의 서로 다른 초기화는 의사 랜덤 생성기가 두 경우 모두에서 랜드로 이어지는 후속 호출에 대해 동일한 일련의 결과를 생성하도록 지시합니다.
하지만 의문은 남아있습니다.위 사양은 동일한 공정 내의 RNG에만 적용된다고 가정합니다.크로스 플랫폼이나 크로스 컴파일러에 대해서는 아무것도 명시하지 않을 가능성이 높습니다.원하는 모든 플랫폼에서 사용 가능한 라이브러리를 찾는 것이 최선의 방법일 것입니다.그러면 동일한 값으로 시드를 받은 경우 동일한 숫자 순서를 반환하도록 상당히 안전해야 합니다.
언급URL : https://stackoverflow.com/questions/922358/consistent-pseudo-random-numbers-across-platforms
'programing' 카테고리의 다른 글
| Linux Bash to mysql: 외부 값이 있는 레코드 선택 또는 삭제 (0) | 2023.10.15 |
|---|---|
| Spring GenericFilter Bean의 예외 처리 (0) | 2023.10.15 |
| jQuery애니메이션 스크롤 (0) | 2023.10.15 |
| 앱의 배경 이미지를 반복하는 방법 (0) | 2023.10.15 |
| 매니페스트 병합 실패: uses-sdk:minSdkVersion 14 (0) | 2023.10.15 |