如何在C#/Unity和Python之间同步PRNG?

如何在C#/Unity和Python之间同步PRNG?,c#,python,unity3d,random,C#,Python,Unity3d,Random,我有一个用Unity/C实现的游戏,它使用内置的PRNG(UnityEngine.Random)生成简单的环境。我试图在Python3中重新实现环境生成过程。我需要同步随机数生成器,以便在提供相同的种子时,Unity中的实际游戏和Python重新实现生成完全相同的环境。同步这两个平台的最佳方法是什么 到目前为止,我考虑了一些解决方案: 尝试在C#中重新实现Python的默认随机数生成器(random)。源代码是可用的,但相当长,因此在实践中可能很难实现 尝试在Python中重新实现UnityE

我有一个用Unity/C实现的游戏,它使用内置的PRNG(
UnityEngine.Random
)生成简单的环境。我试图在Python3中重新实现环境生成过程。我需要同步随机数生成器,以便在提供相同的种子时,Unity中的实际游戏和Python重新实现生成完全相同的环境。同步这两个平台的最佳方法是什么

到目前为止,我考虑了一些解决方案:

  • 尝试在C#中重新实现Python的默认随机数生成器(
    random
    )。源代码是可用的,但相当长,因此在实践中可能很难实现
  • 尝试在Python中重新实现UnityEngine.Random。然而,我没有任何源代码,即使我知道使用的PRNG类,也不能保证我能够完全相同地成功地重新实现它
  • 在两者中实现相同的PRNG。然而,对于我的用例,我不知道PRNG的好选项是什么。我基本上需要一些看起来随机的东西(虽然它不一定是安全的),并且不需要超过一到两个小时就能组合起来。有一个很长的PRNG列表,我不知道实现每个PRNG的困难
  • 或者可能有人在某个时候做过这件事。。。?不过,我在网上找不到任何东西
关于最好的方法,或者我可以在C#和Python中轻松实现的简单PRNG,有什么建议吗


谢谢

一般来说,在不同语言的两个程序之间“同步”PRNG的最佳方法是在两种语言中实现相同的PRNG

出于您的目的,如果您只想要“看起来随机的东西(尽管它不一定是安全的)”,那么线性同余生成器(LCG)就是一个简单的PRNG。这种生成器在C#和Python中都很容易实现

在许多其他可能性中,一个例子是以下32位LCG(其中
x
是种子):

C#:

Python:

# Generate the next x from the current one.
x = ((0xadb4a92d * x) + 9999999) & 0xFFFFFFFF
有关其他参数选择以及涉及LCG的理论回顾,请参见最近的第8节


然而,LCG远非完美。(例如,上述LCG产生具有弱低位的
x
,因此,例如,每隔一个
x
是奇数,每隔一个
x
是偶数。)并且一般来说,LCG,尤其是那些具有32位种子或其他短种子的LCG,远远不适用于许多情况,包括科学工作或信息安全。如果您需要另一种PRNG选择,我将列出。

通常,在两个不同语言的程序之间“同步”PRNG的最佳方法是在两种语言中实现相同的PRNG

出于您的目的,如果您只想要“看起来随机的东西(尽管它不一定是安全的)”,那么线性同余生成器(LCG)就是一个简单的PRNG。这种生成器在C#和Python中都很容易实现

在许多其他可能性中,一个例子是以下32位LCG(其中
x
是种子):

C#:

Python:

# Generate the next x from the current one.
x = ((0xadb4a92d * x) + 9999999) & 0xFFFFFFFF
有关其他参数选择以及涉及LCG的理论回顾,请参见最近的第8节


然而,LCG远非完美。(例如,上述LCG产生具有弱低位的
x
,因此,例如,每隔一个
x
是奇数,每隔一个
x
是偶数。)并且一般来说,LCG,尤其是那些具有32位种子或其他短种子的LCG,远远不适用于许多情况,包括科学工作或信息安全。如果您想要PRNG的另一个选择,我会列出。

为什么您首先需要重新实现它?为什么生成必须在运行时进行?虽然如果你真的需要这样做的话,你应该将生成代码分开,使其足够独立,以便能够将其包含在两个项目中(例如:作为动态链接库),但我正在游戏中进行强化学习,需要非常快地生成大量的环境。我不需要渲染它们,因此使用游戏编译版本的开销是不必要的,并且会减慢过程。但我确实需要它们在不同平台上保持一致,这样我就可以为调试目的呈现它们。我没有想过要从生成大量随机数序列开始,但这可能相对简单。弄清楚如何创建DLL可能太耗时了。您可以在C#via中运行Python的
random
。如果你不在乎速度或优雅,它应该会起作用。FWIW,一位朋友刚刚建议使用Mulbery32 PRNG。我想我会先尝试实现它(似乎实现起来比较简单)。谢谢@清洁工,酷,我去看看!为什么首先需要重新实现它?为什么生成必须在运行时进行?虽然如果你真的需要这样做的话,你应该将生成代码分开,使其足够独立,以便能够将其包含在两个项目中(例如:作为动态链接库),但我正在游戏中进行强化学习,需要非常快地生成大量的环境。我不需要渲染它们,因此使用游戏编译版本的开销是不必要的,并且会减慢过程。但我确实需要它们在不同平台上保持一致,这样我就可以为调试目的呈现它们。我没有想过要从生成大量随机数序列开始,但这可能相对简单。弄清楚如何创建DLL可能太耗时了。您可以在C#via中运行Python的
random
。如果你不在乎速度或优雅,它应该会起作用。FWIW,一位朋友刚刚建议使用Mulbery32 PRNG。我想我会先尝试实现它(似乎实现起来比较简单)。谢谢@清洁工,酷,我去看看!阿维索姆