如何将变异循环转换为功能样式?

时间:2018-05-18 04:40:02

标签: random rust

我想实现一个包含256个随机数的数组,数字必须是0到1之间的值。

此代码有效,但我想让它更具功能性。如何将第2部分转换为功能样式并将其与第1部分中的表达式链接起来?

let t: f64 = 1.0;
let n = 256;
let dt: f64 = t / n as f64;

let mut numbers = Vec::<f64>::with_capacity(n);
let mut rng = rand::thread_rng();

// section 1
numbers = iter::repeat(())
    .map(|()| rng.gen_range(0., 1.))
    .take(n)
    .collect::<Vec<f64>>();

// section 2  
for i in 0 .. n {
    numbers[i] = numbers[i] * dt.sqrt();
}

2 个答案:

答案 0 :(得分:4)

转换第2部分只是一个简单的map

numbers = numbers.into_iter()
    .map(|x| x * dt.sqrt())
    .collect::<Vec<_>>();

要合并,只需在某个时间点上map

numbers = iter::repeat(())
    .map(|()| rng.gen_range(0., 1.))
    .map(|x| x * dt.sqrt())
    .take(N)
    .collect::<Vec<f64>>();

或者如果您愿意:

numbers = iter::repeat(())
    .map(|()| rng.gen_range(0., 1.) * dt.sqrt())
    .take(N)
    .collect::<Vec<f64>>();

答案 1 :(得分:2)

这是一个解决方案playground

extern crate rand;

use rand::*;

fn main() {
    let t: f64 = 1.0;
    let n = 256;
    let dt = t / f64::from(n);
    let sdt = dt.sqrt();

    let mut rng = rand::thread_rng();
    let numbers: Vec<f64> = (0..n).map(|_| rng.gen_range(0., 1.) * sdt).collect();

    println!("{:#?}", numbers);
}

clippy提出了一些小改动。