跨平台随机数生成器

14

当您需要从种子生成随机数,并保证它在不同版本的.NET Framework和Mono Framework以及不同架构(x86、x64)之间是相同的,该怎么办?

我目前正在考虑将数百万个随机字节存储在文件中,以解决这个问题,但我认为可能有更好的方法(希望不会太复杂)。


1
也许你可以实现自己的随机数生成算法(最好是伪随机以保证确定性)。 - Rob I
你想要可预测的随机数吗? - Darren Kopp
5
“Random”类中随机数生成器的实现不能保证在.NET Framework的主要版本更新后仍然保持不变。 - Mr. Smith
3
@DarrenKopp:我相信他想要可重复的随机数。 - Oliver Charlesworth
2
我在这里发布了一个Mersenne Twister的实现,你可以从这里剪切和粘贴:https://dev59.com/xGQn5IYBdhLWcg3wY2PK#16881065 - Matthew Watson
显示剩余3条评论
3个回答

16
如果你需要一个真正便携的实现,最好的选择可能就是使用自定义的随机数生成器,例如这个Mersenne Twister 实现 或者 Colin Green 的快速随机数生成器。通过控制实现方式,你可以保证在任何平台上给出相同的种子,都能得到相同的结果。

2
Colin Green的Xorshift RNGs实现似乎正是我所需要的,但我不确定其许可协议是什么。GPL甚至LGPL与该项目不兼容。 - Mr. Smith
2
@Mr.Smith 我会直接写信问他,但链接的页面确实包含“本文采用知识共享署名3.0许可协议授权”。 - Reed Copsey

3

此外,通过NuGet还可使用Troschuetz.Random库,提供了几种“标准”随机化方法,这些方法在其他平台上也可以使用:

完全托管的库,提供各种随机数生成器和分布。更准确地说,此库提供了7个生成器(ALF、MT19937、Standard、XorShift128、NR3、NR3Q1、NR3Q2),6个离散分布(伯努利、二项式、分类、离散均匀、几何、泊松)和21个连续分布(如正态、指数、卡方、贝塔等),此外,它还提供了一个类似于Python提供的随机类(TRandom)。

此库背后的所有辛勤工作都是由Stefan Troschütz完成的,并在.NET包中由Alessio Parma进行了优化。


1

这个算法是Multiply-with-carry伪随机数生成器。我不得不遵循维基编辑历史记录来弄清楚。 - YukiNyaa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接