如何将可变循环转为函数式风格?优化Rust随机数生成代码
如何将Rust代码转为函数式风格并链式调用?
嘿,我来帮你把这段代码改成更地道的函数式风格!你原来的section 2是通过循环逐个修改向量元素,其实完全可以把这个缩放逻辑直接整合到section 1的迭代器链式调用里,这样整个流程一气呵成,不需要额外的可变操作。
改写后的完整代码
use rand::Rng; use std::iter; fn main() { let t: f64 = 1.0; let n = 256; let dt: f64 = t / n as f64; let sqrt_dt = dt.sqrt(); // 提前计算平方根,避免重复计算 let mut rng = rand::thread_rng(); let numbers: Vec<f64> = iter::repeat(()) .map(|()| rng.gen_range(0.0..=1.0)) // 生成0到1(含边界)的随机数 .map(|num| num * sqrt_dt) // 直接在这里完成缩放操作 .take(n) .collect(); }
关键改动说明
- 把原来section 2里的
numbers[i] = numbers[i] * dt.sqrt()逻辑,移到了迭代器的第二个map调用中,这样随机数生成后立刻完成缩放,不需要再单独遍历修改向量。 - 提前计算了
sqrt_dt,避免每次map都重复计算平方根,虽然性能影响不大,但更符合函数式里的“纯计算”思路,也更高效。 - 整个流程没有手动操作可变向量的元素,完全通过迭代器的链式转换完成,更符合函数式编程强调的无副作用、纯转换的特点。
如果你想更紧凑一点,也可以把两个map合并成一个:
let numbers: Vec<f64> = iter::repeat(()) .map(|()| rng.gen_range(0.0..=1.0) * sqrt_dt) .take(n) .collect();
这样写法更简洁,本质和分开的两个map是一样的,选你觉得可读性更好的方式就行~
内容的提问来源于stack exchange,提问作者madeinQuant
相关产品推荐
相关产品推荐

