我有一个特定的用例,我需要从Iterator<Item = (i8, f64)>
中选择最大元素。如果迭代器中有多个最大元素,我想随机选择一个均匀分布的最大元素。
我尝试了max_by
函数的迭代器,但它不工作,因为我需要它,因为它总是返回最后一个元素,如果有多个最大的元素。这里的例子:
fn main() {
let v = [(-1i8, 0.4f64), (0, 0.2), (1, 0.4)];
let max = v.into_iter().max_by(|(_, r), (_, s)| r.total_cmp(s)).unwrap(); //always returns (1, 0.4)
println!("{:?}", max);
}
playground
我需要一个函数返回另一个迭代器的最大元素。然后我可以选择一个随机元素从该迭代器。
2条答案
按热度按时间mspsb9vt1#
在std中没有,但在
itertools
中有:56lgkhnf2#
你可以让你的比较函数在被比较的项相等时随机返回
Less
或Greater
,并使用适当的权重来获得均匀的采样:Playground
但是请注意,这取决于
Iter::max_by
的实现(特别是它将参数传递给比较闭包的顺序),因此您可能需要自己重写它(例如使用Iter::fold
或Iter::reduce
)以确保顺序。