给定相同的初始种子,Unity 2017随机数生成器是否可以跨平台确定性?


17

给定相同的初始种子,统一引擎的随机数生成器是跨平台确定的还是我应该实现自己的?

我知道最近对随机数生成器进行了一些修改。

感谢您提供答案,我手头没有进行任何测试的设备,而且我还没有找到关于此事的直接声明。


11
好问题。但是,当您的游戏依赖于确定性的程序生成时,您可能仍要编写自己的PRNG,以防Unity决定更改其算法。该文档未记录该算法,因此您不应承担任何保证。
菲利普

1
我理解您的观点,但是有足够的工作要做,我宁愿了解一下目前国家统一的PRNG处于什么状态,并进一步提供将来的版本。在不知情的情况下使用它可能会导致一些令人沮丧的错误。谢谢你的建议。
eternalNoob

2
我赞同@Philipp的建议。如果您需要确定性的RNG,则应该投资编写自己的RNG(并对其进行测试)。如果您需要使用新的Unity版本并且RNG再次更改,您将受到很大的伤害。如果发生这种情况,您几乎不可能重新创建相同的RNG,并保持与以前的保存/世界的兼容性。
Stephane Hockenhull

5
我认为建议可以写为一个答案,“现在是确定性还是不确定性,不要指望它总是一样的”(如果你们中的任何一个都那么倾向于-我不想偷走你的雷声)。表面上有些是或否的问题最好用“选项C:其他”来回答;)
DMGregory

Answers:



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,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.