#rust
#Ржавчина
Вопрос:
Я хочу обновить веса для ключа после его рисования, как я могу это сделать.
use rand::distributions::WeightedIndex;
use rand::prelude::*;
fn main() {
let mut rng = thread_rng();
let items = [('a', 0), ('b', 3), ('c', 7)];
let dist2 = WeightedIndex::new(items.iter().map(|item| item.1)).unwrap();
for _ in 0..10 {
// 0% chance to print 'a', 30% chance to print 'b', 70% chance to print 'c'
println!("{}", items[dist2.sample(amp;mut rng)].0);
// dist2.update_weights(new_weights: amp;[(usize, amp;X)])
}
}
То есть, когда отображается «b», я хочу установить вес для b равным нулю, чтобы он больше не отображался, или установить для него какой-либо другой вес.
https://docs.rs/rand/0.7.3/rand/distributions/weighted/struct .WeightedIndex.html
Комментарии:
1. Вам просто нужно вызвать
update_weights
и указать индекс('b', 3)
initems
. Возможно, вы захотите отслеживать это отдельно, если коллекция большая.2. Да, написал код.
Ответ №1:
use rand::distributions::WeightedIndex;
use rand::prelude::*;
fn main() {
let mut rng = thread_rng();
let items = [('a', 8), ('b', 5), ('c', 1)];
let mut dist2 = WeightedIndex::new(items.iter().map(|item| item.1)).unwrap();
for _ in 0..3 {
let index = dist2.sample(amp;mut rng);
println!("{}", index);
println!("{:?}", items[index].0);
dist2.update_weights(amp;[(index, amp;0)]).unwrap();
}
}
Вам просто нужно вызвать update_weights
функцию в том же дистрибутиве — она изменит существующий дистрибутив, поэтому нет необходимости переназначать. Обратите внимание, что возвращаемое значение update_weights
— это просто a Result<(), WeightedError>
. An Ok(())
указывает, что мутация дистрибутива прошла успешно.
Ответ №2:
Вот мой код:
use rand::distributions::WeightedIndex;
use rand::prelude::*;
fn main() {
let mut rng = thread_rng();
let items = [('a', 8), ('b', 5), ('c', 1)];
let mut dist2 = WeightedIndex::new(items.iter().map(|item| item.1)).unwrap();
for _ in 0..3 {
// 0% chance to print 'a', 30% chance to print 'b', 70% chance to print 'c'
let index = dist2.sample(amp;mut rng);
println!("{}", index);
println!("{:?}", items[index].0);
let _d = dist2.update_weights(amp;[(index, amp;0)]);
}
}