Skip to content

Instantly share code, notes, and snippets.

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