FsRandom.Pcg 1.4.0
dotnet add package FsRandom.Pcg --version 1.4.0
NuGet\Install-Package FsRandom.Pcg -Version 1.4.0
<PackageReference Include="FsRandom.Pcg" Version="1.4.0" />
paket add FsRandom.Pcg --version 1.4.0
#r "nuget: FsRandom.Pcg, 1.4.0"
// Install FsRandom.Pcg as a Cake Addin #addin nuget:?package=FsRandom.Pcg&version=1.4.0 // Install FsRandom.Pcg as a Cake Tool #tool nuget:?package=FsRandom.Pcg&version=1.4.0
F# 的 PCG 伪随机数生成器
关于 PCG
PCG 是一族简单的快速空间高效统计良好的随机数生成算法。与许多通用 RNG 不同,它们也难以预测。你可以在 此处 了解更多关于 PCG 的信息。
System.Random
不太理想
System.Random
存在一些可能不适合某些用户的问题。具体来说
它使用一种隐晦的算法来生成随机数。
Random 类的当前实现基于 Donald E. Knuth 的减法随机数生成器算法。更多信息,请参阅 D. E. Knuth. "The Art of Computer Programming, volume 2: Seminumerical Algorithms". Addison-Wesley, Reading, MA, 第二版,1981。
尝试用谷歌搜索。然后,搜索“梅森迭代器”或“线性同余发生器”。你看出区别了吗?这种算法的神秘性很重要。虽然它是被一位备受尊敬的计算机科学家设计的,但它的输出可能并不足够随机,甚至更糟,它可以被轻易预测。想象一下你在玩游戏,而你的对手可以预测骰子的滚动或洗牌的顺序。《可预测性》直接违反了随机性的定义。虽然没有任何软件可以生成完全随机的材料,但它可以提供一个不错的尝试;并且做得很好。此外,
System.Random
的实现存在严重缺陷。这一点更针对F#用户,但,无论底层算法如何,
System.Random
类具有可变状态,这是功能程序设计的反模式。例如,使用不可变值,在像C#这样的有状态、命令式语言中再次生成相同的随机流可能有点困难。使用System.Random
的成本是添加副作用,这是功能程序员惧怕的事情。但别担心。F#有一个用于功能随机数生成的良好库(链接)。
PCG更好
出自此处(有修改)
- 它非常容易使用,同时非常灵活,并提供了强大的功能(其中一些功能在这个库中还没有提供)(包括一些允许你做愚蠢的派对把戏的功能)。
- 它速度很快,并且可以占用非常小的空间(只有32字节的州,与
System.Random
的232字节状态相比,以及梅森迭代器的2.5 KiB内部状态相比)。 - 其代码大小较小。
- 在统计测试中的性能极佳(详情请参阅PCG论文)。
- 它比大多数生成器都有更低的可预测性,因此更安全,尽管我不会建议将其用于加密应用。
- 参考实现是开源软件,许可证是许可性质的(Apache许可证)。
文档
库的文档在wiki中。您还可以检查源代码注释。
产品 | 版本 兼容的和额外的计算目标框架版本。 |
---|---|
.NET | net5.0 已计算。 net5.0-windows 已计算。 net6.0 已计算。 net6.0-android 已计算。 net6.0-ios 已计算。 net6.0-maccatalyst 已计算。 net6.0-macos 已计算。 net6.0-tvos 已计算。 net6.0-windows 已计算。 net7.0 已计算。 net7.0-android 已计算。 net7.0-ios 已计算。 net7.0-maccatalyst 已计算。 net7.0-macos 已计算。 net7.0-tvos 已计算。 net7.0-windows 已计算。 net8.0 已计算。 net8.0-android 已计算。 net8.0-browser 已计算。 net8.0-ios 已计算。 net8.0-maccatalyst 已计算。 net8.0-macos 已计算。 net8.0-tvos 已计算。 net8.0-windows 已计算。 |
.NET Core | netcoreapp2.0 已计算。 netcoreapp2.1 已计算。 netcoreapp2.2 已计算。 netcoreapp3.0 已计算。 netcoreapp3.1 已计算。 |
.NET Standard | netstandard2.0 兼容。 netstandard2.1 已计算。 |
.NET Framework | net461 已计算。 net462 已计算。 net463 已计算。 net47 已计算。 net471 已计算。 net472 已计算。 net48 已计算。 net481 已计算。 |
MonoAndroid | monoandroid 已计算。 |
MonoMac | monomac 已计算。 |
MonoTouch | monotouch 已计算。 |
Tizen | tizen40 已计算。 tizen60 已计算。 |
Xamarin.iOS | xamarinios 已计算。 |
Xamarin.Mac | xamarinmac 已计算。 |
Xamarin.TVOS | xamarintvos 已计算。 |
Xamarin.WatchOS | xamarinwatchos 已计算。 |
-
.NETStandard 2.0
- FSharp.Core (>= 4.2.3)
- SoftWx.Numerics.Portable (>= 2.3.0)
NuGet 包
此包没有被任何 NuGet 包使用。
GitHub 仓库
此包没有被任何流行的 GitHub 仓库使用。
将 FsRandom 的源代码集成到项目中。
FsRandom 进行了一些改进(`ref` 变成了 `mutable` 等)。
该库现在仅针对 .NET Standard 2.0。
今天是美好的一天。现在不应该有任何重要的事情。