3.10 序列
2 分钟阅读
Rand 通过 IteratorRandom 和 SliceRandom trait 实现了序列上的几种常见随机操作。
生成索引
采样时:
- 在给定范围内采样单个索引,使用
Rng::random_range - 从
0..length采样多个不同索引,使用index::sample - 从带权重的
0..length采样多个不同索引,使用index::sample_weighted
洗牌
对切片洗牌:
SliceRandom::shuffle:完全洗牌切片SliceRandom::partial_shuffle:部分洗牌;适合以随机顺序提取amount个随机元素
采样
以下提供从切片或迭代器采样值的便捷方式:
SliceRandom::choose:从切片采样一个元素(按引用)SliceRandom::choose_mut:从切片采样一个元素(按可变引用)SliceRandom::choose_multiple:从切片采样多个不同元素(返回元素引用的迭代器)IteratorRandom::choose:从迭代器采样一个元素(按值)IteratorRandom::choose_stable:从迭代器采样一个元素(按值),RNG 调用不受迭代器size_hint影响IteratorRandom::choose_multiple_fill:采样多个元素,放入缓冲区IteratorRandom::choose_multiple:采样多个元素,返回Vec
注意对迭代器操作通常比对切片操作效率低。
加权采样
例如,加权采样可用于模拟从装有 5 颗绿色、15 颗红色和 80 颗蓝色弹珠的桶中抽取弹珠的颜色。
有放回
有放回抽样意味着任何被采样的值(弹珠)都会被放回(因此每种变体被采样的概率不受抽样行为影响)。
由以下分布实现:
WeightedIndex设置快,采样O(log N)WeightedAliasIndex设置慢,采样O(1),因此样本量大时可能更快
为方便起见,可使用:
无放回
无放回抽样意味着抽样行为会修改分布。由于 Distribution trait 围绕不可变分布构建,我们提供:
SliceRandom::choose_multiple_weighted:从带权重的切片采样amount个不同值index::sample_weighted:从带权重的范围采样amount个不同索引- 自行实现:见随机过程一节