29 个版本 (15 个稳定版)

2.0.1 2023年12月20日
1.1.5 2023年11月8日
1.1.4 2023年10月20日
1.1.0 2023年3月5日
0.3.0 2022年2月23日

#600测试 类别中

Download history 197/week @ 2024-04-07 279/week @ 2024-04-14 369/week @ 2024-04-21 233/week @ 2024-04-28 162/week @ 2024-05-05 246/week @ 2024-05-12 253/week @ 2024-05-19 140/week @ 2024-05-26 249/week @ 2024-06-02 185/week @ 2024-06-09 213/week @ 2024-06-16 350/week @ 2024-06-23 274/week @ 2024-06-30 124/week @ 2024-07-07 220/week @ 2024-07-14 319/week @ 2024-07-21

每月 944 次下载
11 crates (4 直接) 使用

BSD-3-Clause

22KB
298

Ran crates.io crates.io GitHub last commit Actions Status

作者:Libor Spacek

描述

此 crate 的目标是快速、简单、占用最小空间地生成高质量的随机数。它完全使用 Rust 安全编写,轻量且无任何依赖。

提供多种生成算法,以及一系列实用的函数。它们可以轻松生成各种支持的类型、向量以及填充随机数的向量。还可以指定要生成的值的范围。

主要目标是易用性,但算法也非常快。它们主要是现代 XOR 和 shift 类型,即使用这两个低级指令。在文本中给出了参考。

强烈建议阅读 tests/tests.rs 中的使用示例。可以通过点击此文档顶部的 'test' 徽章查看最新的自动化测试日志。(徽章也作为链接)。

入门

这些算法使用线程安全的静态种子,在编译时自动初始化为 systime 秒。如果使用此crate的程序每秒重新编译超过 6.3376E+56 年,它将每次生成一个新的唯一随机序列。这意味着序列在实用上是不可预测的。警告:这不是在密码学意义上的。

为了在每次运行时强制不可预测的序列,请使用 set_seeds(0);。这对于现实主义的模拟很有用。种子将被设置为 systime 纳秒。然后,相同的序列有时可能会重复,概率低至 2E-64

为了生成可重复的随机序列,必须使用 set_seeds(value); 初始化种子到一个已知值。每个 u64 值将生成它自己的唯一随机序列。这对于精确比较很有用,例如,在完全相同的随机数据上测试的不同算法。可以使用 get_seed() 获取并保存当前种子值,然后在任何后来的时间重新创建相同的序列。

函数名称语法

名称 ::= ran{维度}_类型
维度 ::= v|vv
类型 ::= u8|u16|u64|i64|f64|u64_range|i64_range|f64_range

生成支持类型的单个随机数

示例

fn ran() {
    println!("ran_u8:     {}",ran_u8()); 
    println!("ran_u16:    {}",ran_u16());
    println!("ran_u64:    {}",ran_u64()); 
    println!("ran_i64:    {}",ran_i64());
    println!("ran_f64:    {}",ran_f64());
    println!("ran_u64_range: {}",ran_u64_range(1..=6));   
    println!("ran_i64_range: {}",ran_i64_range(-6..=6));   
    println!("ran_f64_range: {}",ran_f64_range(-100.0..=100.0));   
}

生成支持类型的随机数向量

示例

fn ranv()-> Result<(),Re> {
    println!("ranv_u8:     {}",stringv(&ranv_u8(5)?)); 
    println!("ranv_u16:    {}",stringv(&ranv_u16(5)?));
    println!("ranv_u64:    {}",stringv(&ranv_u64(5)?)); 
    println!("ranv_i64:    {}",stringv(&ranv_i64(5)?));
    println!("ranv_f64:    {}",stringv(&ranv_f64(5)?)); 
    println!("ranv_u64_range: {}",stringv(&ranv_u64_range(5,1..=6)?));   
    println!("ranv_i64_range: {}",stringv(&ranv_i64_range(5,-6..=6)?));   
    println!("ranv_f64_range: {}",stringv(&ranv_f64_range(5,-100_f64..=100_f64)?));  
    Ok(()) 
}

说明

  • 这些函数检查它们的参数,并可能返回错误。
  • stringv 是一个将泛型向量 '转换为字符串' 的实用函数,用于显示。

生成随机数矩阵

示例

fn ranvv()-> Result<(),Re> {
    set_seeds(0);
    println!("ranvv_u8:     {}",stringvv(&ranvv_u8(2,5)?)); 
    println!("ranvv_u16:    {}",stringvv(&ranvv_u16(2,5)?));
    println!("ranvv_u64:    {}",stringvv(&ranvv_u64(2,5)?)); 
    println!("ranvv_i64:    {}",stringvv(&ranvv_i64(2,5)?));
    println!("ranvv_f64:    {}",stringvv(&ranvv_f64(2,5)?)); 
    println!("ranvv_u64_range: {}",stringvv(&ranvv_u64_range(2,5,1..=6)?));   
    println!("ranvv_i64_range: {}",stringvv(&ranvv_i64_range(2,5,-6..=6)?));   
    println!("ranvv_f64_range: {}",stringvv(&ranvv_f64_range(2,5,-100_f64..=100_f64)?));  
    Ok(()) 
}

说明

  • 这些函数检查它们的参数,并可能返回错误。
  • stringvv 是一个将泛型向量矩阵 '转换为字符串' 的实用函数,用于显示。

最新版本(按时间顺序排列)

版本 2.0.1 修正了 ranvv_f64_range 中交换的参数 d,n。

版本 2.0.0 删除了从用户角度看不必要的枚举泛型。

版本 1.1.5 一些小的注释和测试改进。

版本 1.1.41.1.3 中删除的 get_seed() 已恢复。它对于保存 SEED 的状态以在以后重新生成相同的序列很有用。

版本 1.1.3 由于 Rust 1.73.0 的支持,进行了一些代码简化。还将 rerror 实用函数更改为返回 Result

版本 1.1.2 种子在编译时初始化。这意味着相同的可执行文件将始终产生相同的序列。为了完全不可预测,可以新使用 set_seeds(0)

版本 1.1.1 现在种子自动初始化为 systime 秒,因此序列是不可预测的。当需要相同的序列时,手动将种子初始化为先前使用的值。

版本 1.1.0 更好的错误处理。将别名类型 RanError<String> 重命名为 Re。引入了函数 rerror

没有运行时依赖