Unity 2017の乱数ジェネレーターは、同じ初期シードが与えられたプラットフォーム間で決定論的ですか?


17

統一エンジンの乱数ジェネレーターは、同じ初期シードが与えられたプラットフォーム間で決定論的ですか、それとも独自に実装する必要がありますか?

最近、乱数ジェネレーターにいくつかの変更が加えられたことを知っています。

回答を歓迎します。テストを実行するためのデバイスが手元になく、この問題に関する直接の声明はまだ見つかりませんでした。


11
良い質問。しかし、ゲームが決定論的な手続き生成に依存している場合、Unityがアルゴリズムを変更することにした場合に備えて、とにかく独自のPRNGをプログラムすることができます。文書にはアルゴリズムが文書化されていないため、保証を想定しないでください。
フィリップ

1
私はあなたの主張を理解していますが、やり遂げるのに十分な仕事があります、私はむしろどのような状態の団結のPRNGが現在あるのかを学び、将来的に将来の証拠バージョンを提供したいと思います。知らずにそれを使用すると、いくつかの本当にイライラするバグにつながる可能性があります。助言ありがとう。
eternalNoob

2
2番目の@Philippのアドバイス。決定論的なRNGが必要な場合は、独自のRNGの作成(およびテスト)に投資する必要があります。新しいUnityバージョンを使用する必要があり、RNGが再び変更された場合、あなたは怪我の世界にいます。これが発生した場合、同じRNGを再作成し、以前の保存/ワールドとの互換性を維持することはほぼ不可能です。
ステファンホッケンハル

5
アドバイスは答えとして書く価値があると思います、「今それが決定論的であるかどうかは、常に同じであると期待しないでください」(あなたのどちらかがそんなに傾いているなら-私はしたくない雷を盗む)。表面的に「はい」または「いいえ」の質問には、「オプションC:その他」でより良い回答があります;)
DMGregory

回答:


8

広範なテストを行う時間はありませんでしたが、初期の研究では、使用された乱数ジェネレーターは異なるプラットフォームで決定的であることが示唆されています。使用される正確な実装はUnity PRNGです。異なるハードウェア上のUnityランダムシードも参照してください。
ユニティとRandomクラス、PRNGの正確な状態を保存することができ、以下を参照してくださいユニティランダムサテを


7

トーマスは質問に答えました。より重要な質問は次のとおりです。

Unity 2017の乱数ジェネレーターは、同じシードが与えられた現在および将来のすべてのプラットフォームで同じ番号を配信することが保証されていますか?また、Unityの将来のリリースと同じ番号を配信することが保証されていますか?

これが当てはまる可能性はかなり高いですが、それは保証とは異なります。残念ながら、答えは「いいえ、違います」です。Randomのドキュメントに明示的に保証を記載する必要がありますが、現時点ではそのようなことはありません。

個人的には、たとえそのような保証があったとしても、それを信用しないことをお勧めします-保証があったとしても、実装が偶然に変更される可能性があります(バグ)、または単に非推奨になって後で削除される可能性があります。ある時点で、Unityフレームワークの外部でジェネレーターを再利用することもできます。Unityに依存する代わりに、誰かが書いた乱数ジェネレーターをコピーし(コードの使用を許可されていることを確認してください)、ランダム性の要件を満たしていることを確認するテストを作成します。


4

Unity 2017.2.0f3を使用すると、UnityEngine.Randomは複数のプラットフォームで同じ結果をもたらすようです。Windows 10、macOS 10.12 Sierra、およびAndroid 7でテスト済み。

テストするために、作成したSeedFactoryクラスをトリミングしました。

using UnityEngine;

public class SeedFactory {

    private Random.State state;

    public SeedFactory (int seed) {
        Random.InitState(seed);
        state = Random.state;
    }

    // Set Unity's global Random state with this SeedFactory's state, get a random int,
    // then set our SeedFactory's state with the new state.
    // (this allows us to use multiple SeedFactories for multiple paths of determinism
    // if desired)
    public int GetRandomInt (int minInclusive, int maxExclusive) {
        Random.state = state;
        int randomInt = Random.Range(minInclusive, maxExclusive);
        state = Random.state;
        return randomInt;
    }

}

そして、テストを実行するMonoBehaviour:

public class SeedTest : MonoBehaviour {

    void Start () {
        SeedFactory seedFactory = new SeedFactory(123456789);
        string result = "";
        for (int i = 0; i < 20; i++) {
            result += seedFactory.GetRandomInt(int.MinValue, int.MaxValue) + ", ";
        }
        Debug.Log(result);
    }

}

結果はすべて同じです。

Windows Editor:
217814258, 711215697, 1793372675, -1318111305, -513578644, 1776128467, -1503243711, -285471819, -1800526065, -1845985472, -2061970588, 188207569, 1858341351, -1139513088, 2136219157, 1255727479, -2070068486, 459175680, 1151694536, 1232856178, 

Windows Standalone:
217814258, 711215697, 1793372675, -1318111305, -513578644, 1776128467, -1503243711, -285471819, -1800526065, -1845985472, -2061970588, 188207569, 1858341351, -1139513088, 2136219157, 1255727479, -2070068486, 459175680, 1151694536, 1232856178,

macOS Standalone:
217814258, 711215697, 1793372675, -1318111305, -513578644, 1776128467, -1503243711, -285471819, -1800526065, -1845985472, -2061970588, 188207569, 1858341351, -1139513088, 2136219157, 1255727479, -2070068486, 459175680, 1151694536, 1232856178,

Android:
217814258, 711215697, 1793372675, -1318111305, -513578644, 1776128467, -1503243711, -285471819, -1800526065, -1845985472, -2061970588, 188207569, 1858341351, -1139513088, 2136219157, 1255727479, -2070068486, 459175680, 1151694536, 1232856178,
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.