15 个稳定版本 (3 个主要版本)
11.1.4 | 2024年7月6日 |
---|---|
11.1.3 | 2020年11月21日 |
11.1.2 | 2020年6月11日 |
11.1.0 | 2019年10月4日 |
0.1.0 | 2019年7月15日 |
#22 in 算法
2,692,473 每月下载量
用于 5,330 个 crate(59 个直接使用)
34KB
350 行
oorandom
这是什么?
oorandom
是 Rust 中的一个简约伪随机数生成器。对于那些 rand
crate 太大,而你又想要一个更简单一些的情况。
更具体地说,它实现了 ONE prng,目前是一个排列同余生成器(PCG)。如果出现更好的东西,它可能会改变,但这种情况似乎不太可能,并且可能会进行主要版本升级。它将为您提供 u32
或 u64
,以及相应的有符号或浮点数。它也是 #[no_std]
。其他都是额外的。
感谢 Lokathor 开发了 randomize
,这激发了我自己实现一个等效方案。
这个名字来源于我尝试找到一种好的发音方式来称呼 /dev/urandom
。
请将问题、讨论和错误报告发送至 问题跟踪器。
为什么使用 oorandom
而不是...
rand
--oorandom
更简单,没有需要做出的选择。它还可以以 1/10 的时间编译,并且有稳定的 API。getrandom
-- 它们解决的是不同的问题;getrandom
会提供操作系统决定提供的任何安全随机数,而不是一个可确定的和可播种的 PRNG。通常,使用getrandom
来播种这个 RNG 是一个好主意。randomize
--randomize
以前更复杂,但randomize
3.x 在功能和设计上与oorandom
非常相似。试试吧。rand_pcg 和
rand_core
-- 你当然可以将rand
分解成它的各个部分,并单独使用,如果你想要放弃全功能的解决方案,同时处理rand_core 中的不稳定性和真正确定你需要哪些部分。它工作得很好。但它似乎比所需的要复杂。
nanorand
--nanorand
使用了 WyRand 随机数生成算法,据说比 PCG 更快,质量至少一样好。我没有验证这些说法,也不知道有任何 真正 详尽的第三方调查,尽管它显然通过了 Dr. Lemire 的测试。所以现在我个人认为 WyRand 处于“信任但核实”的质量水平。可能没问题。2027 年再来看看。fastrand
-- 看起来没问题,使用与oorandom
相同的算法。由与smol
异步运行时相同的人制作,这可能对你有利也可能不利。比oorandom
做的稍微多一些,这也可能对你有利也可能不利。如果你喜欢它,就使用它。
这不是...
这不是密码学安全的,如果你用它来进行加密,你会得到应有的结果。你也要负责选择一个有用的种子;getrandom
库可能对此有所帮助。
这也没有被优化为极度快速,但基本上与 rustc
感觉适合它的速度一样快。这意味着它是安全、稳健和可移植的,并且不涉及任何巧妙技巧。
使用方法
use oorandom;
fn main() {
let some_seed = 4;
let mut rng = oorandom::Rand32::new(some_seed);
println!("Your random number is: {}", rng.rand_float());
}
如果你需要一个非确定性种子,我建议使用 getrandom
库来生成。
许可证
MIT
随机数简史
随机数的有用性早已为那些也懂得使用计算尺的人们所知。如果你想在不需要从现实世界中收集所有这些麻烦的输入数据的情况下进行数学运算,那么你可以随便使用任何随机数,只要它们中没有模式来破坏你试图研究的模式即可。所以在 20 世纪上半叶,老妇人 Edith 转动轮盘或者从篮子里抽出宾果球并写下结果,这些结果被汇编成巨著并出版,以便工程学院购买并在书架上存放。任何需要一些无意义数字的人都可以拿出这本巨著,翻到一页似乎随机的页面,就可以找到他们需要的所有随机数。问题解决了,生活很美好。
在 1940 年代末,计算机被发明出来,但它们太大、太贵,不能用来 故意 生成无意义的数据,所以一切照旧。如果你在计算机程序中需要随机数,你只需要一个名叫 Mary 的年轻女士帮你将书的一部分转录到穿孔卡片上。
大约在 1960 年代初,计算机的速度足够快,以至于 Edith 和 Mary 无法跟上,于是它们被缩减规模并被更多的计算机所取代。为了做到这一点,人们想出了线性同余发生器(LCG),它可以生成大量看似随机的数字。LCG 在即使是二流的大学也能负担得起的计算机上工作得很好,所以问题解决了,生活很美好。
在某个未知的时间点,大概在 60 年代或 70 年代,似乎有人发明了线性反馈移位寄存器(LFSR)。这些可以生成看起来随机的数字,与需要执行复杂的乘法运算的 LCG 相比,它们在硬件上更容易实现。LFSR 生成的看似随机的数字对于硬件人员来说足够好了,所以他们每次需要时就使用 LFSR,而且从未回头。
无论如何,到了60年代末,那些知道如何使用计算尺的人已经意识到,使用看起来随机的数字可能会严重影响他们的数学计算,而更常见的LCG实现之一RANDU实际上是最糟糕的。因此,仅仅使用任何旧的LCG是不够的,你必须使用由拥有数学博士学位的人制作的。唐纳德·克努特向世界挥舞拳头,喊道:“哈!我早就告诉过你们了!”他出版了一本关于如何正确做的书,但大多数人都没有阅读,然后回到他的独居堡垒去编写TeX。因为RANDU是由IBM创建的,它的糟糕性现在被永远铭刻在像这样的历史文献中。由于当时编写操作系统和编程语言的人实际上已经不再使用计算尺,也不需要非常好的看起来随机的数字,所以每个人都继续使用他们以前使用的任何旧垃圾随机数生成器。问题得到了解决,或者至少不是特别有问题,生活很美好。
此外,在70年代或80年代,密码学的技艺开始从政府机密工作中泄露到现实世界中。人们开始思考他们可以通过使卫星电视加密,以至于持有业余无线电台执照的平民无法观看,能从中赚多少钱,这些人开始给那些拥有数学博士学位的人更多钱,让他们找出如何实现这一点。很快,就确定LCG和LFSR产生的看起来随机的数字不足以真正妨碍一个懂得使用计算尺的人,而且由于爱迪丝早已退休到新泽西州的一个小海滨住宅,他们需要想出如何让计算机产生更好的看起来随机的数字。但是,使数字看起来足够随机,以至于某人无法逆转过程并免费观看付费点播,这是一个缓慢的过程,涉及许多其他人并不关心的细节,因此这个话题就自行发展了,将不再进一步提及。
事情就是这样一直继续到90年代末,突然间,计算机无处不在,有一代人在太晚的时候成长起来,不知道如何使用计算尺,所以他们用计算机做所有的数学。现在他们正在做大量的数学,他们环顾四周,意识到他们的看起来随机的数字实际上并不真正随机,这现在实际上已经成为一个问题。因此发明了梅森旋转器。它相当慢,消耗了大量的内存,产生的随机数相当一般,但它比糟糕的LCG好得多,最重要的是,它有一个酷炫的名字。大多数人不想阅读克努特的书,找出如何制作一个非糟糕的LCG,所以每个人在可能的情况下都开始使用梅森旋转器。问题得到了解决,生活很美好。
这是直到2010年代初期的情况,当时我完成了硕士学业,又开始关注这个问题。人们突然意识到,使用名为xorshift的算法可以使看起来随机的数字比Mersenne Twister更好。Xorshift运行速度快,生成的随机数字看起来很好,而且不需要占用整个3千字节的空间,这样就不会占用空间,也不会在教堂的邻居中引起议论。它有时在某些特定情况下,其数字看起来不够随机,但人们已经对它们的随机性有所保留,所以一些数学博士慢慢耐心地花费数年时间研究解决这个问题,从而产生了xoshiro、xoroshiro、xoroshiro+、xoroshiro*等一系列相关的东西。没有人能真正区分它们之间的差异,但每个人都同意它们比Mersenne Twister更好,更容易实现,而且名字也几乎一样酷。发表了大量的论文,问题得到了解决,生活很美好。
然而,大约在同一时间,一些聪明的年轻人意识到,如果你读了Knuth的书,并认真思考你正在做的事情,其实并不难,可以把旧的LCG(线性同余生成器)提升到很高的水平。这个结果被称为Permutated Congruential Generator,或PCG。它几乎让正在研究xorshift生成器的人们感到非常烦恼,因为它的体积小、速度快,并且生成的随机数字甚至满足了那些在这个时代喜欢用计算尺来娱乐的人。它也使用了xor运算和位移操作,这可是xorshift的地盘,该死,名字就在里面!由于没有人发现PCG有任何缺点,所以大家耸了耸肩说:“那就这样吧”,这就是截至2019年的现状。问题得到了解决,生活很美好。