Rust rang随机数生成字符串和结构体

这篇博客介绍了如何在Rust中使用rand库生成随机字符串、字符,并探讨了其在生成结构体和复合类型如元组、数组中的应用。通过示例展示了生成随机整数、浮点数、布尔值和Unicode字符的分布特性,同时讨论了生成Option和特定长度数组的策略。

Rust rang随机数生成字符串

使用随机板条箱 [dependencies] rand = "0.8.4",利用rand生成随机字符串或者字符

    let mut rng = rand::thread_rng();
    let s: String = Alphanumeric
        .sample_iter(&mut rng)
        .take(7)
        .map(char::from)
        .collect::<String>()
        .to_uppercase();
    println!("{s}");

或者

 	use rand::Rng;
    let s: String = rand::thread_rng()
        .sample_iter(&rand::distributions::Alphanumeric)
        .take(10)
        .map(char::from)
        .collect::<String>();
    println!("{s}");

除了上面的功能还能实现向结构体或者元组转化,下面是Standard官方说明


Assuming the provided Rng is well-behaved, these implementations generate values with the following ranges and distributions:

Integers (i32, u32, isize, usize, etc.): Uniformly distributed over all values of the type.
char: Uniformly distributed over all Unicode scalar values, i.e. all code points in the range 0…0x10_FFFF, except for the range 0xD800…0xDFFF (the surrogate code points). This includes unassigned/reserved code points.
bool: Generates false or true, each with probability 0.5.
Floating point types (f32 and f64): Uniformly distributed in the half-open range [0, 1). See notes below.
Wrapping integers (Wrapping), besides the type identical to their normal integer variants.
The Standard distribution also supports generation of the following compound types where all component types are supported:

Tuples (up to 12 elements): each element is generated sequentially.
Arrays (up to 32 elements): each element is generated sequentially; see also Rng::fill which supports arbitrary array length for integer types and tends to be faster for u32 and smaller types. When using rustc ≥ 1.51, enable the min_const_gen feature to support arrays larger than 32 elements. Note that Rng::fill and Standard’s array support are not equivalent: the former is optimised for integer types (using fewer RNG calls for element types smaller than the RNG word size), while the latter supports any element type supported by Standard.
Option first generates a bool, and if true generates and returns Some(value) where value: T, otherwise returning None


元组和数组都做了限制,我们利用Standard来生成一个结构体看看

use rand::Rng;
use rand::distributions::{Distribution, Standard};

#[allow(dead_code)]
#[derive(Debug)]
struct Point{
    x:i32,
    y:i32,
}

impl Distribution<Point> for Standard{
    fn sample<R:Rng + ?Sized>(&self, rng: &mut R) ->Point{
        let (rand_x,rand_y) = rng.gen();
        Point{
            x:rand_x,
            y:rand_y,
        }
    }
}
fn main() {
    let mut rng = rand::thread_rng();
    let rand_tuple = rng.gen::<(u32,bool,f64)>();
    let rand_point: Point = rng.gen();
    println!("Random tuple: {rand_tuple:?}");
    println!("Randdom Point: {rand_point:?}");
}

输出:

Random tuple: (638821994, true, 0.871651610454623)
Randdom Point: Point { x: 1113437538, y: 862171486 }

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值