Skip to content

Instantly share code, notes, and snippets.

@DAP-DarkneSS
Created July 31, 2011 17:42
Show Gist options
  • Save DAP-DarkneSS/1117006 to your computer and use it in GitHub Desktop.
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.
#!/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