절차 생성과 그와 무작위 생성의 차이점에 대해 머리를 싸고 있습니다. 차이점은 결정적이라는 것입니다. 특정 임의의 엔진과 마찬가지로 특정 시드 값을 기반으로합니다.절차 생성을 위해 입력 가능한 시드를 생성하는 방법은 무엇입니까?
C++ 11에서는 '최상의'임의 시퀀스를 얻으려면 std::seed_seq
을 사용해야하며 암호로 보호 할 필요가 없으므로 std::mt19937
이 좋습니다.
레벨을 생성 할 수 있도록 전 세계 오브젝트의 위치를 원하는 다음 내 친구에게이 새로운 레벨의 시드를 텍스트로 보내고 싶습니다. 정말 멋 있었기 때문입니다. 하지만 그대로 입력하면 189151022 140947902 1454660100 853918093 3243866855
은 정말 짜증납니다. 그렇다면, 임의성이 조금 더 타입 - 어빌리티가 유지되도록하기 위해 개발자로서 무엇을 할 수 있습니까?
해시 값을 문자열로 생각한 다음 역순으로 처리 (해시 값을 기억)하거나 해시 자체를 사용하지만 그 값이 더 좋지 않습니까? 아니면 심지어 중요합니까, 그리고 난 그냥 내 종자로 "롤"을 사용할 수 있으며, 그 메가 바이트 - 길이 완벽하게 난수만큼 좋은가?
다음은 간단한 이해를 돕기 위해 작성한 간단한 예입니다.
#include <iostream>
#include <random>
#include <array>
using std::cout;
using std::endl;
using std::array;
struct pos
{
float x, y;
pos(float x, float y) : x(x), y(y) {}
void print()
{
cout << "(" << x << " " << y << ")" << endl;
}
};
int main()
{
//Get seed
std::random_device rd;
array<unsigned long, 5> seed = { rd(), rd(), rd(), rd(), rd() };
//Seed generator
std::mt19937 generator;
generator.seed(std::seed_seq(seed.begin(), seed.end()));
//Setup distribution
std::uniform_real_distribution<float> distribution(0, 100);
//Generate the world (or whatever)
pos a = pos(distribution(generator), distribution(generator));
pos b = pos(distribution(generator), distribution(generator));
pos c = pos(distribution(generator), distribution(generator));
//And many, many more calls to get values from the generator
a.print();
b.print();
c.print();
//For when I want the same world back
cout << "Seed: ";
for (unsigned long s : seed)
{
cout << s << " ";
}
cout << endl;
}
명확하게하기 위해, 내가 부탁 해요 질문은 : 나는 게임 환경에서 절차 발전기의 씨앗에 사용하고, 그나과의 그 일의 단점은 무엇을해야합니까
그 패션?
일반적으로 게임에서 "멋진"난수를 사용할 필요는 없습니다. 일반 32 비트 시드 (4 자리 16 진수, 매우 텍스트 가능)를 사용해 보았는데 충분히 좋지 않다고 결론을 냈습니까? (게임에 대한 "최상의"RNG는 가장 잘 작동하는 RNG이며, 반드시 "최상의 임의성"이있는 것은 아닙니다.) – molbdnilo
@molbdnilo 기본적으로 모르겠습니다. 그러므로 질문. 나는 무작위 수 생성이 어떻게 작동하는지에 대해 계속 흐릿한 입장을 취하고 있으며, 짧은 시드를 사용하여 풀이 흘러가는 것과 같은 문제에 부딪치게된다. – Yann
참고 : 두 번의 '배포'호출은 지정되지 않은 순서로 발생하므로 위치는 컴파일러와 컴파일러 설정에 따라 다를 수 있습니다. 신뢰할 수있는 위치를 원할 경우 'pos'에 전달하기 전에 값을 계산하십시오. – molbdnilo