Random(int seed)保证什么?

我正在开发一个项目,它依赖于为更大的集合随机分配用户(没有任何花哨,只是统一)的子集。 每个用户都有一个从同构到整数的唯一标识符。 据我所知,有两种方法可以做到这一点。

  1. 在用户和上述较大集合的键控元素之间创建数据库联结表,并为每个用户创建一次函数。 这对我的需求来说有点不切实际,所以我宁愿做……
  2. 在运行时,通过类似的函数确定子集,但使用唯一的用户ID作为种子值,并将该集合放在内存中。 下次需要它时,从更大的集合中再次创建它。

所以我的问题是,如果我使用.NET Random对象创建第二个使用user-id作为种子值的函数,Microsoft是否保证将来不会更改Random算法? 即所有新的Random(n)的Next()序列在所有机​​器上都会永远相同吗?

或者,我可以创建自己的随机生成器,并将其与我的代码打包。 事实上,这是我可能会做的,但我仍然很想知道答案。

微软不能保证他们的代码永远不会改变,因为代码改进发生在已识别的漏洞,问题或商品上 – 但是,到目前为止,代码没有改变,如果你不改变框架,你应该总是有相同的function。

所以把它看作好像不会改变……但是当你决定升级框架时,确保它仍然有效。

不, 明确不保证在不同版本之间兼容:

在.NET Framework的主要版本中,不保证Random类中随机数生成器的实现保持不变。 因此,您的应用程序代码不应假设相同的种子将在 .NET Framework的不同版本中产生相同的伪随机序列

您可以使用一个非常大的素数来生成一个看似非常随机的数字序列,它将始终是相同的序列:

p = VeryLargePrimeNumber q =任何小于p的数字(但不能太小)

迭代是这样的:

n =(n * q)%p

第一个是种子。

可能是某种加密方法会更适合……也就是说,每次迭代都会对种子位进行签名,并在下次迭代时签署先前的签名,依此类推。

假设上下文保持不变 – 即底层代码不变 – 为固定值n的伪随机数生成器播种应该使生成器每次都生成完全相同伪随机序列。

供应商 – 在这种情况下是微软 – 可以保证PRSG的实施永远不会改变。 但是,他们没有:他们为什么要这样做? 他们指出PRNG类似于熵的产生。

如果您使用PRNG生成可重复的唯一标识符,那么您就会咆哮错误的树。