Как преобразовать мутирующий цикл в функциональный стиль? - PullRequest
0 голосов
/ 18 мая 2018

Я хочу реализовать массив с 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 голосов
/ 18 мая 2018

Вот одно из решений детская площадка

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.

0 голосов
/ 18 мая 2018

Преобразование раздела 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>>();
...