Методы получения случайных комбинаторных объектов — различия между версиями
Cczy (обсуждение | вклад) |
Cczy (обсуждение | вклад) |
||
Строка 17: | Строка 17: | ||
prefix[i] = b[j] | prefix[i] = b[j] | ||
break | break | ||
− | '''return''' | + | '''return''' prefix |
Версия 22:46, 7 декабря 2018
Описание алгоритма
Задача: |
Необходимо сгенерировать случайный комбинаторный объект размера | с равномерным распределением вероятности, если в наличии есть функция для генерации случайного числа в заданном интервале.
Пусть
- множество различных элементов, которые могут находиться в данном комбинаторном объекте.Будем получать элементы по порядку: сначала определим, какой элемент будет стоять на первом месте, потом на втором и так далее. Считаем, что мы построили префикс длинны
: . Будем выбирать элемент из множества всех возможных так, чтобы вероятность выбора элемнта , была пропорциональна числу комбинторных обьектов размера с префиксом . Для этого разобъем отрезок натуральных чисел . где - число различных комбинаторных объектов с текущим префиксом, на диапазонов так, чтобы размер диапазаоны был равен числу объектов с префиксом . С помощью функция для генерации случайного числа получим число в интервале [1, s] и добавим к префиксу элемент соответствующий диапазону отрезка в которм находится полученное число.object randomObject(n: int, k: int): for i = 1 to n s = number(prefix) // число комбинаторных объектор с текущим префиксом. r = random(1, s) for j = 1 to k if number(prefix + b[j]) < r r = r - number(prefix + b[j]) else prefix[i] = b[j] break return prefix