#伪随机 #随机 #浮点数 #浮点

floaters

以各种方式生成浮点数

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算法

Download history 121/week @ 2024-05-13 17/week @ 2024-05-20 156/week @ 2024-06-10 154/week @ 2024-06-17 248/week @ 2024-06-24 90/week @ 2024-07-08 33/week @ 2024-07-15 2/week @ 2024-07-22

每月 127 次下载

MIT 许可证

22KB
154

Floaters

以几种实验性的方式生成浮点数。不仅尾数可以用伪随机位填充,而且至少部分指数,取决于所选方法。如果指数包含伪随机位,数字将不会均匀分布。这些方法在某些需要更广范围数字的场合可能很有用,而均匀分布不是优先考虑的。符号位也可能根据方法为伪随机。

该包为任何实现 Rng 的类型添加了一个从 rand_core 的 trait。

在版本 0.5.0 中,移除了对 rand_xoshiro 的重新导出,并添加了更多辅助函数。

示例

plot

上面的图表是用以下代码创建的

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()); }

}

参考文献

https://www.jstatsoft.org/article/view/v008i14/xorshift.pdf

https://prng.di.unimi.it

https://mina86.com/2016/random-reals/

依赖

~315KB