Создание случайного выбора с некоторыми результатами, которые выбираются чаще других (Making random choice with some outcomes more likely than others)

Материал из Ren'Py Wiki
Перейти к навигации Перейти к поиску

Наиболее техническим способ для описания данного рецепта станет случайный выбор с дискретным неравномерным распределением вероятностей.

Допустим, у вас имеется нижеупомянутый перечень звуков поцелуев и вы хотите выбрать случайным образом один из них. Но поскольку kiss3.mp3 - очень особенный звук поцелуя, вы хотите, чтобы он выбирался реже, чем остальные звуки поцелуев. Как мы будем это делать?

Исходные данные (The input)[править | править код]

Начнем со списка возможных вариантов и каждому элементу присвоим весомость показателя, где написано, какова вероятность, что звук будет выбран:

[('kiss1.mp3',3) , ('kiss2.mp3',3) , ('kiss3.mp3',1)]

Приведенный выше перечень будет означать, что из 7 раз, в среднем, 3 раза будет выбран kiss1.mp3, как и kiss2.mp3, а kiss3.mp3 будет выбран только один раз.

Код (The code)[править | править код]

Для реализации требуется код на Python:

python:
       class NonUniformRandom(object):
            def __init__(self, list_of_values_and_probabilities):
                """
                в ожидании списка [ (значения, вероятности), (value, probability),...]
                """
                self.the_list = list_of_values_and_probabilities
                self.the_sum = sum([ v[1] for v in list_of_values_and_probabilities])

            def pick(self):
                """
                Возвращает случайное значение, с учетом вероятности
                """
                import random
                r = random.uniform(0, self.the_sum)
                s = 0.0
                for k, w in self.the_list:
                    s += w
                    if r < s: return k
                return k

Пример использования вышеуказанного кода (Example using this code)[править | править код]

python:
    # Инициализация нашего случайного выбора с параметрами и их вероятностью быть выбранными:
    n = NonUniformRandom( [('kiss1.mp3', 3), ('kiss2.mp3',3), ('kiss3.mp3',1)] )
    # Теперь генерируем демонстрацию поцелуев, с помощью 14-ти звуков поцелуев
    for i in range(14):
        renpy.sound.queue(n.pick())

Источник[править | править код]

Статья "Making random choices with some outcomes more likely than others" на английском языке


На главную страницу Книга рецептов Энциклопедии Ren'Py Книга рецептов Ren'Py Вернуться к началу статьи