Skip to content

Instantly share code, notes, and snippets.

@DAP-DarkneSS
Created July 31, 2011 14:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save DAP-DarkneSS/1116830 to your computer and use it in GitHub Desktop.
Save DAP-DarkneSS/1116830 to your computer and use it in GitHub Desktop.
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 in: ")
#Приветствие, ввод верхней и нижней границ интервала генерирования.
#Ввод среднего значения.
if mini > maxi:
maxi, mini = mini, maxi
#Если при вводе были перепутаны границы, то они меняются местами.
maxi = min(maxi, (mean * n - mini * (n - 1)))
mini = max(mini, (mean * n - maxi * (n - 1)))
#Немного математики: mini*(n-1)+maxi<=summ. Этим простым неравенством
#можно ограничить верхний интервал. По аналогии ограничиваем и нижний.
#Выбираем между рассчитанным ограничением и введённым значением.
value = []
for i in range(0,n):
value.append(triangular(mini, maxi, mean))
#Создание пустого списка и заполнение его случайными числами из заданного интервала.
#Вероятность генерирования числа тем выше, чем оно ближе к заданному среднему значению.
if abs(max(value) - mean) > abs(min(value) - mean):
extreme = value.index(max(value))
else:
extreme = value.index(min(value))
#Вычисляется значения с наибольшим отклонением от заданного среднего.
value[extreme] = mean * n - sum(value) + value[extreme]
#Это число заменяется на такое, чтобы среднее значение списка совпало с заданным
while (max(value) > maxi) or (min(value) < mini):
mi = min(value)
ma = max(value)
i = (min(maxi, ma) - max(mini, mi)) / 2
value[value.index(mi)] += i
value[value.index(ma)] -= i
#Пока какое-нибудь из чисел выходит за интервал, оно изменяется на инкремент,
#рассчитанный из общих соображений. Чтобы не изменилось среднее значение,
#другое число изменяется на -1*инкремент.
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