我正在开发一个项目,它依赖于为更大的集合分配用户随机(没有花哨,只是统一)的子集。每个用户都有一个从同构到整数的唯一标识符。据我所知,有两种方法可以做到这一点。
所以我的问题是,如果我使用.NET Random对象创建第二个使用user-id作为种子值的函数,Microsoft是否保证将来不会更改Random算法?即所有新的Random(n)的Next()序列是否会在所有机器上永远相同?
或者我可以创建自己的随机生成器,并将其与我的代码打包。事实上,这是我可能会做的,但我仍然很想知道答案。
答案 0 :(得分:14)
不,版本之间的兼容性为explicitly not guaranteed:
在.NET Framework的主要版本中,不保证Random类中随机数生成器的实现保持不变。因此,您的应用程序代码不应假设相同的种子将在不同版本的.NET Framework中产生相同的伪随机序列。
答案 1 :(得分:8)
Microsoft cannot guarantee you that their code will never change因为代码改进发生在已识别的漏洞,问题或商品上 - 但是,到目前为止,代码没有改变,如果您不在线更改框架,则应始终具有相同的功能
因此,请将其视为不会改变...但是当您决定升级框架时,请确保它仍然有效。
答案 2 :(得分:4)
您可以使用一个非常大的素数来生成一个看似非常随机的数字序列,它将始终是相同的序列:
p = VeryLargePrimeNumber q =任何小于p的数字(但不能太小)
迭代是这样的:
n =(n * q)%p
前n是种子。
可能是一些加密方法会更适合... 也就是说,每次迭代都会对种子位进行签名, 并在下一次迭代中签署上一个签名, 等等。答案 3 :(得分:0)
鉴于上下文保持不变 - 即底层代码未更改 - 使用固定值 n 播种伪随机数生成器应该使生成器生成完全每次都使用相同的伪随机序列。
供应商 - 在这种情况下,微软 - 可以保证PRSG的实施永远不会改变。但是,他们没有:他们为什么要这样做?他们指出PRNG类似于熵的产生。
如果您正在使用PRNG生成可重复的唯一标识符,那么您就会咆哮错误的树。