Начиная с Python 3.6, в стандартной библиотеке Python есть решение random.choices
.
Пример использования: давайте настроим популяцию и весы, соответствующие тем, которые находятся в Вопрос OP:
>>> from random import choices
>>> population = [1, 2, 3, 4, 5, 6]
>>> weights = [0.1, 0.05, 0.05, 0.2, 0.4, 0.2]
Теперь choices(population, weights)
генерирует один образец:
>>> choices(population, weights)
4
Необязательный аргумент ключевого слова k
позволяет запрашивать более одного образца в один раз. Это ценно, потому что есть некоторая подготовительная работа, которую random.choices
должен делать каждый раз, когда она вызывается, до создания каких-либо образцов; создавая сразу несколько образцов, нам нужно только сделать эту подготовительную работу один раз. Здесь мы создаем миллион выборок и используем collections.Counter
, чтобы проверить, что распределение, которое мы получаем, грубо совпадает с весами, которые мы дали.
>>> million_samples = choices(population, weights, k=10**6)
>>> from collections import Counter
>>> Counter(million_samples)
Counter({5: 399616, 6: 200387, 4: 200117, 1: 99636, 3: 50219, 2: 50025})
Я нашел решение для своей среды, отразив Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Microsoft.Build.Utilities.v4.0.dll
Моя среда TEMP / TMP переменная указывала на корневую папку RAM-диска (T: \) без дальнейшего вложения каталогов! Строка s_tempPath = Path.GetDirectoryName (Path.GetTempPath ()); в статическом ctor Microsoft.Build.Utilities.FileTracker привела к нулю, что вызвало исключение, о котором вы упомянули.
Теперь моя переменная среды TEMP / TMP указывает на T: \ TEMP, и все работает нормально.
Это обходное решение взято с форумов MS:
Отредактируйте файл проекта и добавьте следующее в первую PropertyGroup:
true