是否有一个标准的跨平台数字生成器/算法/库,如果使用相同的输入(在我的情况下是某种哈希)播种,总是产生相同的伪随机数集?
理想情况下,我希望能够在任何目标机器上的 Java 和 .Net 中实现这个跨平台,并获得相同的一致输出(模糊的随机整数)。
如果不可能,我会自己滚动(我的随机性要求非常低,基本上是用来根据它的 ID 为某物分配不同的颜色 - 我只想始终为同一个项目分配相同的颜色,无论如何我正在运行的系统)。
是否有一个标准的跨平台数字生成器/算法/库,如果使用相同的输入(在我的情况下是某种哈希)播种,总是产生相同的伪随机数集?
理想情况下,我希望能够在任何目标机器上的 Java 和 .Net 中实现这个跨平台,并获得相同的一致输出(模糊的随机整数)。
如果不可能,我会自己滚动(我的随机性要求非常低,基本上是用来根据它的 ID 为某物分配不同的颜色 - 我只想始终为同一个项目分配相同的颜色,无论如何我正在运行的系统)。
有一个非常简单且广为人知的 RNG 算法,“Multiply-with-Carry”,可以在我所知道的所有平台上轻松实现。它具有您要求的属性;由您决定它的随机性是否足够。
来自维基百科:
一个简单的伪随机数生成器的例子是 George Marsaglia 发明的 Multiply-with-carry 方法。它的计算速度很快,并且具有良好的(尽管密码学上不强)随机性特性。
下面是 C# 中非常简单的实现,您可以毫不费力地适应其他语言:
static int m_w = 1337; // Choose initialization value, must not be zero
static int m_z = 123123; // Choose initialization value, must not be zero
int GetRandom()
{
m_z = 36969 * (m_z & 65535) + (m_z >> 16);
m_w = 18000 * (m_w & 65535) + (m_w >> 16);
return (m_z << 16) + m_w; /* 32-bit result */
}
m_w 和 m_z 的初始值是种子。