2016-07-05 11 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」が、あなたにとって最適なものです。それは必ずしも「最良のランダム性」を持つものではありません。) – molbdnilo

+0

@molbdnilo私は基本的にわかりません。したがって、疑問。私は乱数生成の仕組みにぼんやりとしていて、プールのような短いシードだけを使い果たすような問題に遭遇した場合、私は引き続き問題になります。 – Yann

+1

注記: 'distribution 'への2回の呼び出しは、指定されていない順序で行われるため、コンパイラの設定やコンパイラの設定によって位置が異なる場合があります。信頼できる位置を望むならば、それらの値を 'pos'に渡す前にそれらの値を計算してください。 – molbdnilo

答えて

-1

シードを文字列値にします。文字列から使用する番号を取得するには、sha256のようにします。

1

十分に長い文字列( 'gorgeous house'など)から始めます。

ハッシュして、数値に変換します(ランダムシードには十分です)。 ハッシュはstring characters and their positionを使用して取得できます。

反対側で同じハッシュ関数を使用する場合、あなたの友人は同じテキストを使用して同じ番号を得ることができます(同じ種子!)。

関連する問題