У меня есть вектор, где элемент (String, String)
. Как я могу случайно выбрать один из этих элементов?
Как я могу случайным образом выбрать один элемент из вектора или массива?
Ответ 1
Вам нужен rand
ящик, а именно метод choose
.
use rand::seq::SliceRandom; // 0.6.5
fn main() {
let vs = vec![0, 1, 2, 3, 4];
println!("{:?}", vs.choose(&mut rand::thread_rng()));
}
Ответ 2
Использование choose_multiple
:
use rand::seq::SliceRandom; // 0.6.5
fn main() {
let samples = vec!["hi", "this", "is", "a", "test!"];
let sample: Vec<_> = samples
.choose_multiple(&mut rand::thread_rng(), 1)
.collect();
println!("{:?}", sample);
}
Ответ 3
Если вы хотите выбрать более одного элемента, чем может быть ваш ящик random_choice:
extern crate random_choice;
use self::random_choice::random_choice;
fn main() {
let mut samples = vec!["hi", "this", "is", "a", "test!"];
let weights: Vec<f64> = vec![5.6, 7.8, 9.7, 1.1, 2.0];
let number_choices = 100;
let choices = random_choice().random_choice_f64(&samples, &weights, number_choices);
for choice in choices {
print!("{}, ", choice);
}
}
Ответ 4
Другой выбор для взвешенной выборки, который уже включен в ящик rand
, это WeightedIndex
, в котором есть пример:
use rand::prelude::*; use rand::distributions::WeightedIndex; let choices = ['a', 'b', 'c']; let weights = [2, 1, 1]; let dist = WeightedIndex::new(&weights).unwrap(); let mut rng = thread_rng(); for _ in 0..100 { // 50% chance to print 'a', 25% chance to print 'b', 25% chance to print 'c' println!("{}", choices[dist.sample(&mut rng)]); } let items = [('a', 0), ('b', 3), ('c', 7)]; let dist2 = WeightedIndex::new(items.iter().map(|item| item.1)).unwrap(); for _ in 0..100 { // 0% chance to print 'a', 30% chance to print 'b', 70% chance to print 'c' println!("{}", items[dist2.sample(&mut rng)].0); }
Ответ 5
Если вы также хотите удалить выбранный элемент, вот один из способов сделать это (используя ящик rand
):
let mut vec = vec![0,1,2,3,4,5,6,7,8,9];
let index = (rand::random::<f32>() * vec.len() as f32).floor() as usize;
let value = vec.remove( index );
println!("index: {} value: {}", index, value);
println!("{:?}", vec);
remove(index)
удаляет это значение в index
(смещая все элементы после него влево) и возвращает значение, которое было в index
(docs).