Вот более эффективный способ сделать это:
Просто вызовите следующую функцию с массивом 'weightights' (при условии, что индексы соответствуют соответствующим элементам) и no. необходимых образцов. Эта функция может быть легко модифицирована для обработки упорядоченной пары.
Возвращает индексы (или элементы), отобранные / выбранные (с заменой) с использованием их соответствующих вероятностей:
def resample(weights, n):
beta = 0
# Caveat: Assign max weight to max*2 for best results
max_w = max(weights)*2
# Pick an item uniformly at random, to start with
current_item = random.randint(0,n-1)
result = []
for i in range(n):
beta += random.uniform(0,max_w)
while weights[current_item] < beta:
beta -= weights[current_item]
current_item = (current_item + 1) % n # cyclic
else:
result.append(current_item)
return result
Краткая заметка о концепции, используемой в цикле while. Мы уменьшаем вес текущего элемента от кумулятивной бета-версии, которая является совокупным значением, построенным равномерно случайным образом, и увеличиваем текущий индекс, чтобы найти элемент, вес которого соответствует значению бета-версии.
Используйте wdiff . Он уже выполняет искомое пословное сравнение; преобразование его вывода в уценку должно занять всего несколько простых регулярных выражений.
Например:
$ cat foo
Why do we study programming languages? Not in order to
$ cat bar
We study programming languages not in order to
$ wdiff foo bar
[-Why do we-]{+We+} study programming [-languages? Not-] {+languages not+} in order to
$ wdiff foo bar | sed 's|\[-|<em>|g;s|-]|</em>|g;s|{+|<strike>|g;s|+}|</strike>|g'
<em>Why do we</em><strike>We</strike> study programming <em>languages? Not</em> <strike>languages not</strike> in order to
Изменить: На самом деле, у wdiff есть несколько параметров, которые делают его еще проще:
$ wdiff -w '<em>' -x '</em>' -y '<strike>' -z '</strike>' foo bar
<em>Why do we</em><strike>We</strike> study programming <em>languages? Not</em> <strike>languages not</strike> in order to
Вы не указали целевую платформу, но если вы используете .NET, то вам определенно стоит ознакомиться с этой статьей на CodeProject http://www.codeproject.com/KB/recipes/diffengine.aspx
Механизм diff выполняет сравнение и возвращает вам логический объект, к которому можно применить ваше собственное визуальное форматирование. Я использовал его в нескольких проектах, один из которых был основан на веб-сравнении текстов, и мы смогли представить все эти разметки, как вы хотели выше. Я также расширил движок новыми классами для выполнения пользовательских сравнений типов строк.