Created
July 31, 2011 17:42
-
-
Save DAP-DarkneSS/1117006 to your computer and use it in GitHub Desktop.
2. Generator of random numbers within the specified interval with the specified mean value.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# -*- coding: utf-8 -*- | |
#Указывается язык и кодировка. | |
#This code is released under | |
#GNU LESSER GENERAL PUBLIC LICENSE | |
#http://www.gnu.org/copyleft/lesser.html | |
from random import triangular | |
#Импорт модулей генерации случайных чисел с симметричным распределением. | |
print 'Generation of numbers with a prescribed maximum, minimum and mean value.' | |
print '-----------' | |
maxi = input("Enter maximum number: ") | |
mini = input("Enter minimum number: ") | |
n = input("Enter quantity of numbers: ") | |
mean = input("Enter mean value: ") | |
#Приветствие, ввод верхней и нижней границ интервала генерирования. | |
#Ввод среднего значения. | |
value = [] | |
summ = mean * n | |
#Создание пустого списка. Расчёт суммы всех чисел. | |
if mini > maxi: | |
maxi, mini = mini, maxi | |
#Если при вводе были перепутаны границы, то они меняются местами. | |
m = n - 1 | |
maxi = min(maxi, (summ - mini * m)) | |
mini = max(mini, (summ - maxi * m)) | |
#Немного математики: mini*(n-1)+maxi<=summ. Этим простым неравенством | |
#можно ограничить верхний интервал. По аналогии ограничиваем и нижний. | |
#Выбираем между рассчитанным ограничением и введённым значением. | |
for i in xrange(0, m): | |
if (summ / (n - i)) < mean: | |
value.append(triangular(mini, mean, mean)) | |
else: | |
value.append(triangular(mean, maxi, mean)) | |
summ = summ - value[i] | |
#Заполнение списка случайными числами из интервала от минимума до среднего | |
#или от среднего до максимума в зависимости от того, куда попадает частное | |
#оставшейся суммы и количества несгенерированных чисел. | |
#Вероятность генерирования числа тем выше, чем оно ближе к заданному среднему значению. | |
value.append(summ) | |
#Остаток записывается последним значением. | |
while value[m] > maxi: | |
mi = min(value) | |
increment = (maxi - mi) / 3 | |
value[value.index(mi)] += increment | |
value[m] -= increment | |
#Пока последнее число больше максимума, оно уменьшается на инкремент, | |
#рассчитанный из общих соображений. Чтобы не изменилось среднее значение, | |
#другое число увеличивается на инкремент. | |
#Такое может произойти, когда среднее значительно удалено от одной из границ. | |
while value[m] < mini: | |
ma = max(value) | |
increment = (ma - mini) / 3 | |
value[value.index(ma)] -= increment | |
value[m] += increment | |
#Аналогично, когда последнее число меньше минимума. | |
print '-----------' | |
for i in xrange(0,n): | |
print(value[i]) | |
#Вывод разделителя и значений. | |
raw_input("Enter to exit...") | |
#Программа ожидает ввода. Можно скопировать значения. | |
#Необходимо, если программа запускается не в эмуляторе терминала. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment