Created
July 31, 2011 14:30
-
-
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.
This file contains hidden or 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 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