Created
July 26, 2011 18:11
-
-
Save DAP-DarkneSS/1107408 to your computer and use it in GitHub Desktop.
Generator of random numbers within the specified interval with the maximum permissible relative standard deviation.
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 uniform, triangular | |
from math import sqrt | |
#Импорт модулей генерации случайных чисел с симметричным | |
#и асимметричным распределением и квадратного корня. | |
print 'Generation of numbers with a prescribed maximum, minimum and maximum RSD.' | |
print '-----------' | |
maxi = input("Enter maximum number: ") | |
mini = input("Enter minimum number: ") | |
n = input("Enter quantity of numbers: ") | |
referance = input("Enter maximum RSD in percents: ") | |
#Приветствие, ввод верхней и нижней границ интервала генерирования. | |
#Ввод значения предельного относительного стандартного отклонения. | |
value = [] | |
for i in xrange(0,n): | |
value.append(uniform(mini, maxi)) | |
#Создание пустого списка и заполнение его случайными числами из заданного интервала. | |
rsd = referance + 1 | |
while rsd > referance: | |
#Изначально rsd задаётся больше допустимого, чтобы программа вошла в цикл. | |
mean = sum(value) / n | |
deviation = [] | |
for i in xrange(0,n): | |
deviation.append((value[i] - mean) ** 2) | |
rsd = 100 * (sqrt(sum(deviation) / (n - 1))) / mean | |
#Рассчёт среднего значения. | |
#Рассчёт квадратичных отклонений, которые записываются в список, потому что пригодятся далее. | |
#Рассчёт относительного стандартного отклонения. | |
if rsd > referance: | |
value[deviation.index(max(deviation))] = triangular(min(value), max(value), mean) | |
#Если рассчитанное значение больше заданного предела, | |
#то число по позиции с максимальным отклонением заменяется на случайное с асимметричным | |
#распределением (чем ближе число к третьему параметру, тем больше вероятность его генерирования) | |
#из интервала между вычисленными максимумом и минимумом. Возвращение в начала цикла. | |
print '-----------' | |
for i in xrange(0,n): | |
print(value[i]) | |
print '-----------' | |
print("RSD: "'%.4f' % rsd) | |
#Вывод разделителей, значений, относительного стандартного отклонения, | |
#округлённого до четырёх знаков после запятой. | |
raw_input("Enter to exit...") | |
#Программа ожидает ввода. Можно скопировать значения. | |
#Необходимо, если программа запускается не в эмуляторе терминала. | |
#NB! Запуск в Windows с выводом на русском языке невозможен из-за зоопарка архаичных кодировок! | |
#NB! Называйте переменные так, чтобы имена не совпадали с названиями используемых функций! |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment