我想实现一个包含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();
}
答案 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提出了一些小改动。