Две идеи (позвольте мне проиллюстрировать это отдельными параметрами и соотношениями для ясности в именах аргументов, если они упакованы в кортеж, вы можете сохранить «zip»):
a) Денормализовать веса для получения целочисленных отношений, затем поместить в список столько копий, сколько отношение и использовать random.choice
.
def choice_with_ratios(options, ratios):
tmp = sum([[v]*n for v, n in zip(options, ratios)], [])
return random.choice(tmp)
b) Использовать нормализованные веса и начинать суммирование до тех пор, пока вы не достигнете случайное генерируемое равномерное значение
def choice_with_weights(options, weights):
s = 0
r = random.random()
for v, w in zip(options, weights):
s += w
if s >= r: break
return v
Кстати, если первое поле используется как ключ, вы должны иметь его в словаре, например:
d = {
701: ((1, 0.2), (2, 0.3), (3, 0.5),
702: ((1, 0.3), (2, 0.2), (3, 0.5)
}
UPDATE - ReSharper 2016.1: This option is now moved to Code Editing → C# → Code Style → Add 'using' directive to the deepest scope
Have you tried the ReSharper option:
Languages → C# → Formatting Style → Namespace Imports → Add using directive to the deepest scope
I'm not sure whether R#'s code cleanup will reorder the existing ones for you though.
Я отредактировал свои стандартные шаблоны Visual Studio , чтобы поместить мои директивы using в пространство имен.
Для сортировки и удаления неиспользуемых директив я использую Power Команды для Visual Studio 2008 .