【问题标题】:How do I generate a string of random ASCII printable characters with a specific size in Rust? [duplicate]如何在 Rust 中生成一串具有特定大小的随机 ASCII 可打印字符? [复制]
【发布时间】:2020-01-01 15:07:43
【问题描述】:

我正在尝试使用 Rust 创建一个函数,给定一个整数,返回一个 String 类型的值。

我面临的主要问题是创建一个随机字符;一旦我能做到这一点,我就可以在一个循环或类似的东西中连接很多这些字符,然后返回最终的字符串。

我试图找到方法来输入从 rand crate 中的 random 函数返回的整数(就像在 C++ 中所做的那样),但这似乎不是要走的路。

我该怎么办?

【问题讨论】:

    标签: random rust


    【解决方案1】:

    Rust Cookbook 展示了如何优雅地完成此任务。从上面的链接复制:

    use rand::{thread_rng, Rng};
    use rand::distributions::Alphanumeric;
    
    fn random_string(n: usize) -> String {
        thread_rng().sample_iter(&Alphanumeric)
                    .take(n)
                    .collect()
    }
    

    如果您希望使用rand::distributions 中没有的自定义分发,您可以按照source code for one of the distributions 来实现它,看看如何自己实现它。下面是一些随机符号分布的示例实现:

    use rand::{Rng, seq::SliceRandom};
    use rand::distributions::Distribution;
    
    struct Symbols;
    
    impl Distribution<char> for Symbols {
        fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> char {
            *b"!@#$%^&*()[]{}:;".choose(rng).unwrap() as char
        }
    }
    

    【讨论】:

    • 感谢您提供的信息。我已经相应地更新了答案。相关问题,为什么这里的源代码以旧/错误的方式执行:docs.rs/rand/0.7.2/src/rand/distributions/other.rs.html#63
    • 看来理由在您链接到的代码的注释中。请注意它如何拒绝 62 之外的值和循环。在不知道更多细节的情况下,我希望他们进行了一些分析,并发现有效地内联和简化 Uniform 的实现更高效。
    • 是的,我看到了评论。这就是为什么我选择了 16 的集合大小来避免在上述实现中拒绝抽样:P。不管怎样,我相信他们有他们的理由
    • 需要明确的是,您的原始代码并没有错,只是很可能会在他们添加或删除新角色时将某人引向错误的道路,并且必须处理非权力- 两种尺寸。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    • 1970-01-01
    • 1970-01-01
    • 2017-04-17
    • 2019-01-05
    • 2020-08-21
    • 1970-01-01
    相关资源
    最近更新 更多