6个版本 (破坏性更新)
新 0.5.0 | 2024年8月4日 |
---|---|
0.4.0 | 2024年7月14日 |
0.3.2 | 2024年6月25日 |
0.2.0 | 2024年6月15日 |
0.1.0 | 2024年5月14日 |
#452 在 算法
每月 127 次下载
22KB
154 行
Floaters
以几种实验性的方式生成浮点数。不仅尾数可以用伪随机位填充,而且至少部分指数,取决于所选方法。如果指数包含伪随机位,数字将不会均匀分布。这些方法在某些需要更广范围数字的场合可能很有用,而均匀分布不是优先考虑的。符号位也可能根据方法为伪随机。
该包为任何实现 Rng
的类型添加了一个从 rand_core
的 trait。
在版本 0.5.0
中,移除了对 rand_xoshiro
的重新导出,并添加了更多辅助函数。
示例
上面的图表是用以下代码创建的
use floaters::{NonCanonical, Sign};
use rand_xoshiro::rand_core::RngCore; // version = "0.6.0"
use rand_xoshiro::Xoshiro256PlusPlus;
use rand_seeder::Seeder; // version = "0.3.0"
use plotters::prelude::*; // version = "0.3.6"
fn main() -> Result<(), Box<dyn std::error::Error>> {
let root = BitMapBackend::new("random_walk.png", (800, 600))
.into_drawing_area();
root.fill(&WHITE)?;
let mut prng: Xoshiro256PlusPlus =
Seeder::from("walk the line").make_rng();
(0..1000).for_each(|_| { prng.next_u64(); } );
let mut x: f64 = 50.0;
let mut numbers = Vec::<f64>::with_capacity(100);
(0..100).for_each(|_| {
x += prng.with_params_f64(55, Sign::Signed);
numbers.push(x);
});
let mut chart = ChartBuilder::on(&root)
.caption("(pseudo)random walk",
("sans-serif", 30).into_font())
.margin(5)
.x_label_area_size(30)
.y_label_area_size(30)
.build_cartesian_2d(0f64..100f64, 40f64..60f64)?;
chart.configure_mesh().draw()?;
chart.draw_series(LineSeries::new(numbers
.iter()
.enumerate()
.map(|x| (x.0 as f64, *x.1)),
&RED,))?;
root.present()?;
Ok(())
}
一个更基础的例子
use rand_xoshiro::rand_core::{RngCore, SeedableRng};
use rand_xoshiro::Xoshiro256StarStar; // version = "0.6.0"
use floaters::NonCanonical;
fn main() {
// Generate 5 pseudorandom f64 numbers with pseudorandom bits
// also in the exponent. The numbers are not equidistributed,
// but we get a wider range of values.
let mut rng = Xoshiro256StarStar::from_entropy();
println!("Numbers get closer to zero, \
but are not equidistributed:");
for _ in 0..5 { println!("{}", rng.noncanonical_f64()) }
// Generate tuples of f32 numbers with a truly random seed.
// Clock the PRNG several times without generating numbers.
(0..512).for_each(|_| { rng.next_u64(); } );
println!("\nSigned (f32, f32):");
for _ in 0..5 { println!("{:?}", rng.signed_tuple_f32()); }
}
参考文献
依赖
~315KB