2016-07-05 2 views
1

절차 생성과 그와 무작위 생성의 차이점에 대해 머리를 싸고 있습니다. 차이점은 결정적이라는 것입니다. 특정 임의의 엔진과 마찬가지로 특정 시드 값을 기반으로합니다.절차 생성을 위해 입력 가능한 시드를 생성하는 방법은 무엇입니까?

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; 
} 

명확하게하기 위해, 내가 부탁 해요 질문은 : 나는 게임 환경에서 절차 발전기의 씨앗에 사용하고, 그나과의 그 일의 단점은 무엇을해야합니까

그 패션?

+1

일반적으로 게임에서 "멋진"난수를 사용할 필요는 없습니다. 일반 32 비트 시드 (4 자리 16 진수, 매우 텍스트 가능)를 사용해 보았는데 충분히 좋지 않다고 결론을 냈습니까? (게임에 대한 "최상의"RNG는 가장 잘 작동하는 RNG이며, 반드시 "최상의 임의성"이있는 것은 아닙니다.) – molbdnilo

+0

@molbdnilo 기본적으로 모르겠습니다. 그러므로 질문. 나는 무작위 수 생성이 어떻게 작동하는지에 대해 계속 흐릿한 입장을 취하고 있으며, 짧은 시드를 사용하여 풀이 흘러가는 것과 같은 문제에 부딪치게된다. – Yann

+1

참고 : 두 번의 '배포'호출은 지정되지 않은 순서로 발생하므로 위치는 컴파일러와 컴파일러 설정에 따라 다를 수 있습니다. 신뢰할 수있는 위치를 원할 경우 'pos'에 전달하기 전에 값을 계산하십시오. – molbdnilo

답변

-1

시드를 문자열 값으로 지정하십시오. 문자열에서 사용할 숫자를 얻으려면 해시 스타일을 사용하십시오. sha256

1

'gorgeous house'와 같이 충분히 긴 생성 된 문자열로 시작하십시오.

(해시 시드로 충분) 숫자로 변환하고 해시합니다. 해시는 string characters and their position을 사용하여 얻을 수 있습니다.

다른 쪽에서 동일한 해시 함수를 사용하는 경우 친구는 동일한 텍스트를 사용하고 동일한 숫자 (동일한 시드!)를 가져야합니다.