libc有一个random
函数,它使用一个默认大小为31个长整型数的表格,采用非线性加性反馈随机数生成器返回连续的伪随机数。
我正在寻找一个用Rust编写的与其速度相同的随机函数。它不需要是加密安全的,伪随机就足够了。
在查看rand crate
后,看起来XorShiftRng
是最接近这个需求的:
Xorshift算法不适用于加密目的,但非常快
当我像这样使用它时:
extern crate time;
use rand::Rng;
let mut rng = rand::XorShiftRng::new_unseeded();
rng.next_u64();
这个生成器比libc的随机数慢了约33%。(生成8,000,000个随机数的示例代码)。
最终我需要i64个随机数,因此当我运行rng.gen()
时,它已经比libc的随机数慢了100%。当使用rng.next_u64() as i64
进行类型转换时,则慢了60%。
在Rust中有没有不使用任何unsafe
代码而实现相同速度的方法?
rng.gen()
的XorShiftRng
版本比random()
快760,000倍。所以我的问题解决了,但我不明白为什么发布版本会快这么多,以及为什么XorShiftRng现在比random()
快这么多。 - hansaplast