Как обновить веса в WeightedIndex?

#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) in items . Возможно, вы захотите отслеживать это отдельно, если коллекция большая.

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)]);
    }
}