Создание случайного выбора с некоторыми результатами, которые выбираются чаще других (Making random choice with some outcomes more likely than others)
Наиболее техническим способ для описания данного рецепта станет случайный выбор с дискретным неравномерным распределением вероятностей.
Допустим, у вас имеется нижеупомянутый перечень звуков поцелуев и вы хотите выбрать случайным образом один из них. Но поскольку 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 | Вернуться к началу статьи |