Знатоков python можно найти в конференции welinux@conference.jabber.ru. Спасибо им за помощь и терпение =)
Программа с с разметкой и здесь:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#Указывается язык и кодировка.
from random import uniform
from random import triangular
from math import sqrt
#Импорт модулей генерации случайных чисел с симметричным и нессиметричным распределением и квадратного корня.
print 'Generation of numbers with a prescribed maximum, minimum and maximum RSD.'
print '-----------'
max = input("Enter maximum number: ")
min = input("Enter minimum number: ")
n = input("Enter quantity of numbers: ")
referance = input("Enter maximum RSD in percents: ")
#Приветствие, ввод верхней и нижней границ интервала генерирования и значения предельного относительного стандартного отклонения.
value = []
for i in range(0,n):
value.append(uniform(min, max))
#Создание пустого списка и заполнение его случайными числами из заданного интервала.
rsd = referance + 1
while rsd > referance:
#Изначально rsd задаётся больше допустимого, чтобы программа вошла в цикл.
mean = 0
for i in range(0,n):
mean = mean + (value[i] / n)
#Рассчёт среднего значения.
sum = 0
deviation = []
for i in range(0,n):
deviation.append((value[i] - mean) ** 2)
sum = sum + deviation[i]
#Рассчёт квадратичных отклонений и их суммы, отклонения записываются в список, потому что пригодятся далее.
rsd = 100 * (sqrt(sum / (n - 1))) / mean
#Рассчёт относительного стандартного отклонения.
if rsd > referance:
#Если рассчитанное значение больше заданного предела, то...
if min > max:
i = min
min = max
max = i
#Если при вводе были перепутаны минимальное и максимальное значения, то они меняются местами. Ранее это не имело значения.
valmin = max + 1
valmax = min - 1
maxdev = -1
#Задаются невозможные изначальные значения максимального и минимального чисел и максимального отклонения.
for i in range(0,n):
if value[i] < valmin:
valmin = value[i]
if deviation[i] > maxdev:
maxdev = deviation[i]
extreme = i
if value[i] > valmax:
valmax = value[i]
if deviation[i] > maxdev:
maxdev = deviation[i]
extreme = i
#Если какое-либо число в списке меньше минимального или больше максимального значения, то записывается новое значение и проверяется отклонение числа. Если оно больше максимального значения, то записывается новое значение и его позиция в списке.
value[extreme] = triangular(valmin, valmax, mean)
#Экстремальное значение заменяется на случайное из интервала от максимального до минимального с асимметричным распределением: чем ближе число к среднему, тем больше вероятность его генерирования. Возвращение в начала цикла.
print '-----------'
for i in range(0,n):
print(value[i])
print '-----------'
print("RSD: "'%.4f' % rsd)
#Вывод разделителей, значений, относительного стандартного отклонения, округлённого до четырёх знаков после запятой.
raw_input("Enter to exit...")
#Программа ожидает ввода. Можно скопировать значения. Необходимо, если программа запускается не в эмуляторе терминала.
#-----------
#NB! Запуск в Windows с выводом на русском языке невозможен из-за зоопарка архаичных кодировок!
Первый фикс
Date: 2011-07-25 07:27 pm (UTC)From:/me продолжил изучение матчасти...