統一エンジンの乱数ジェネレーターは、同じ初期シードが与えられたプラットフォーム間で決定論的ですか、それとも独自に実装する必要がありますか?
最近、乱数ジェネレーターにいくつかの変更が加えられたことを知っています。
回答を歓迎します。テストを実行するためのデバイスが手元になく、この問題に関する直接の声明はまだ見つかりませんでした。
統一エンジンの乱数ジェネレーターは、同じ初期シードが与えられたプラットフォーム間で決定論的ですか、それとも独自に実装する必要がありますか?
最近、乱数ジェネレーターにいくつかの変更が加えられたことを知っています。
回答を歓迎します。テストを実行するためのデバイスが手元になく、この問題に関する直接の声明はまだ見つかりませんでした。
回答:
広範なテストを行う時間はありませんでしたが、初期の研究では、使用された乱数ジェネレーターは異なるプラットフォームで決定的であることが示唆されています。使用される正確な実装はUnity PRNGです。異なるハードウェア上のUnityランダムシードも参照してください。
ユニティとRandom
クラス、PRNGの正確な状態を保存することができ、以下を参照してくださいユニティランダムサテを。
トーマスは質問に答えました。より重要な質問は次のとおりです。
Unity 2017の乱数ジェネレーターは、同じシードが与えられた現在および将来のすべてのプラットフォームで同じ番号を配信することが保証されていますか?また、Unityの将来のリリースと同じ番号を配信することが保証されていますか?
これが当てはまる可能性はかなり高いですが、それは保証とは異なります。残念ながら、答えは「いいえ、違います」です。Randomのドキュメントに明示的に保証を記載する必要がありますが、現時点ではそのようなことはありません。
個人的には、たとえそのような保証があったとしても、それを信用しないことをお勧めします-保証があったとしても、実装が偶然に変更される可能性があります(バグ)、または単に非推奨になって後で削除される可能性があります。ある時点で、Unityフレームワークの外部でジェネレーターを再利用することもできます。Unityに依存する代わりに、誰かが書いた乱数ジェネレーターをコピーして(コードの使用を許可されていることを確認してください)、ランダム性の要件を満たしていることを確認するテストを作成します。
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,