Как сделать random с неравномерным распределением в Python?
Сначала определите предельно конкретно, что означает "в начале вероятность выше, чем в конце".
После чего сможете написать свою функцию распределения. Например, в вашем списке 4 элемента и вероятности распределены так: 60, 25, 12, 3, то есть 60% - для 1-го элемента, 25% - для 2-го и так далее.
Тогдаyour_data_list = [...]
probabilities_list=[60, 85, 97, 100]
rnd = random.uniform(1, 100)
idx = -1
idx_found = False
while idx < len(probabilities_list) and not idx_found:
  idx += 1
  idx_found = rnd <= probabilities_list[idx]
your_random = your_data_list[idx]
Однако, это очень медленный способ (и к тому же не лишенный некоторых проблем).
Можно сделать быстрее и короче с помощью модуля bisect:idx = bisect.bisect_right(probabilities_list, rnd)
Этот вариант будет заметно быстрее (иногда, правда, на 20%, но иногда и в 3.5 раза).
Но правильнее всего использовать numpy:numpy.random.choice(your_data_list, size=N, p=prb_list)
Это будет раз в 10 быстрее.
При этом prb_list должен содержать именно вероятности появления каждого элемента, т.е. для вышеприведенного примера [0.6, 0.25, 0.12, 0.03]
Сначала определите предельно конкретно, что означает "в начале вероятность выше, чем в конце".
После чего сможете написать свою функцию распределения. Например, в вашем списке 4 элемента и вероятности распределены так: 60, 25, 12, 3, то есть 60% - для 1-го элемента, 25% - для 2-го и так далее.
Тогдаyour_data_list = [...]
probabilities_list=[60, 85, 97, 100]
rnd = random.uniform(1, 100)
idx = -1
idx_found = False
while idx < len(probabilities_list) and not idx_found:
  idx += 1
  idx_found = rnd <= probabilities_list[idx]
your_random = your_data_list[idx]
Однако, это очень медленный способ (и к тому же не лишенный некоторых проблем).
Можно сделать быстрее и короче с помощью модуля bisect:idx = bisect.bisect_right(probabilities_list, rnd)
Этот вариант будет заметно быстрее (иногда, правда, на 20%, но иногда и в 3.5 раза).
Но правильнее всего использовать numpy:numpy.random.choice(your_data_list, size=N, p=prb_list)
Это будет раз в 10 быстрее.
При этом prb_list должен содержать именно вероятности появления каждого элемента, т.е. для вышеприведенного примера [0.6, 0.25, 0.12, 0.03]