Методы получения случайных комбинаторных объектов — различия между версиями
Cczy (обсуждение | вклад) (→Описание алгоритма) |
Cczy (обсуждение | вклад) (→Описание алгоритма) |
||
| Строка 12: | Строка 12: | ||
r = random(1, s) | r = random(1, s) | ||
'''for''' j = 1 '''to''' k | '''for''' j = 1 '''to''' k | ||
| − | '''if''' number(prefix + b[j]) < r | + | '''if''' number(prefix + b[j]) < r <font color = green> // b {{---}} множество всех возможных элементов. </font> |
| − | r = r - number(prefix + b[j]) | + | r = r - number(prefix + b[j]) <font color = green> // если <tex> r </tex> не попало в текщий диапазон {{---}} перейдем к следующему.</font> |
'''else''' | '''else''' | ||
prefix[i] = b[j] | prefix[i] = b[j] | ||
break | break | ||
'''return''' prefix | '''return''' prefix | ||
Версия 23:03, 7 декабря 2018
Описание алгоритма
| Задача: |
| Необходимо сгенерировать случайный комбинаторный объект размера с равномерным распределением вероятности, если в наличии есть функция для генерации случайного числа в заданном интервале. |
Пусть - множество различных элементов, которые могут находиться в данном комбинаторном объекте.
Будем получать элементы по порядку: сначала определим, какой элемент будет стоять на первом месте, потом на втором и так далее. Считаем, что мы построили префикс длинны : . Будем выбирать элемент из множества всех возможных так, чтобы вероятность выбора элемнта , была пропорциональна числу комбинторных обьектов размера с префиксом . Для этого разобъем отрезок натуральных чисел . где - число различных комбинаторных объектов с текущим префиксом, на диапазонов так, чтобы размер диапазаоны был равен числу объектов с префиксом . С помощью функция для генерации случайного числа получим число в интервале и добавим к префиксу элемент соответствующий диапазону отрезка в которм находится полученное число.
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 // b — множество всех возможных элементов.
r = r - number(prefix + b[j]) // если не попало в текщий диапазон — перейдем к следующему.
else
prefix[i] = b[j]
break
return prefix