当惯用“core::array::from_fn()”初始化数组时,为什么我可以使用“rng.gen()”而不是“rng.gen_range()”?

exo*_*tex 0 random initialization rust

简而言之:为什么我可以使用

let array: [[f64; width]; length] = core::array::from_fn(|_| rng.gen());
Run Code Online (Sandbox Code Playgroud)

但不是

let array: [[f64; width]; length] = core::array::from_fn(|_| rng.gen_range(0.0..1.0));
Run Code Online (Sandbox Code Playgroud)

并不是说它不起作用,但我不明白这里的原因。

kmd*_*eko 5

制作一个数组from_fn只执行一个级别:from_fn(() -> T)创建一个[T; _]. rng.gen()构建完整的内部数组类型也是如此: [f64; width]。这是有效的,因为它可以生成实现标准分布的任何内容,该标准分布是为元素类型实现标准分布的数组实现的。

因此,当您对 执行相同操作时rng.gen_range(0.0..1.0),您要求它[f64; width]从零到一之间的值进行生成,这不太有意义。您可能认为它可以透明地生成零到一之间的多个值,但这不是该函数的工作原理:gen_range(T..T)将生成一个T.

因此,如果您想要一个具有 0 到 1 之间的随机值的多维数组,您需要这样的东西。

let array: [[f64; width]; length] = core::array::from_fn(|_| 
    core::array::from_fn(|_| rng.gen_range(0.0..1.0))
);
Run Code Online (Sandbox Code Playgroud)

  • 这意味着第一个片段可以重写为 `let array: [[f64; 宽度]; 长度] = rng.gen();` (2认同)