Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Для вычисления воспользуемся функциями
meansigmaВ следующем коде предполагается, что есть два массива чисел одинакового размера:
def correlate(x,y) sum = 0.0 x.each_index do |i| sum += x[i]*y[i] end xymean = sum/x.size.to_f xmean = mean(x) ymean = mean(y) sx = sigma(x) sy = sigma(y) (xymean-(xmean*ymean))/(sx*sy)enda = [3, 6, 9, 12, 15, 18, 21]b = [1.1, 2.1, 3.4, 4.8, 5.6]с = [1.9, 1.0, 3.9, 3.1, 6.9]c1 = correlate(a,a) # 1.0c2 = correlate(a,a.reverse) # -1.0c3 = correlate(b,c) # 0.8221970228Приведенная ниже версия отличается лишь тем, что работает с одним массивом, каждый элемент которого — массив, содержащий пару (x, у):
def correlate2(v) sum = 0.0 v.each do |a| sum += a[0]*a[1] end xymean = sum/v.size.to_f x = v.collect {|a| a[0]} y = v.collect {|a| a[1]} xmean = mean(x) ymean = mean(y) sx = sigma(x) sy = sigma(y) (xymean-(xmean*ymean))/(sx*sy)endd = [[1,6.1], [2.1,3.1], [3.9,5.0], [4.8,6.2]]c4 = correlate2(d) # 0.2277822492И, наконец, в последнем варианте предполагается, что пары (x, у) хранятся в хэше. Код основан на предыдущем примере:
def correlate_h(h) correlate2(h.to_a)ende = { 1 => 6.1, 2.1 => 3.1, 3.9 => 5.0, 4.8 => 6.2}c5 = correlated(e) # 0.22778224925.28. Генерирование случайных чисел
Если вас устраивают псевдослучайные числа, вам повезло. Именно они предоставляются в большинстве языков, включая и Ruby.
Метод
randx >= 0.0x < 1.0a = rand # 0.6279091137Если при вызове задается целочисленный параметр
max0...maxn = rand(10) # 7Чтобы «затравить» генератор случайных чисел (задать начальное значение — seed), применяется метод
srandKernelsrandsrand(5)i, j, k = rand(100), rand(100), rand(100)# 26, 45, 56srand(5)l, m, n = rand(100), rand(100), rand(100)# 26, 45, 565.29. Кэширование функций с помощью метода memoize
Пусть имеется вычислительно сложная математическая функция, которую нужно многократно вызывать по ходу работы программы. Если быстродействие критично и при этом можно пожертвовать небольшим количеством памяти, то имеет смысл сохранить результаты вычисления функции в таблице и обращаться к ней во время выполнения. (Тут неявно предполагается, что функция будет часто вызываться с одними и теми же параметрами, то есть получается, что мы «выбрасываем» результат дорогостоящего вычисления и снова повторяем его позже.) Такая техника иногда называется запоминанием (memoizing), отсюда и название библиотеки
memoizeЭта библиотека не входит в стандартный дистрибутив, поэтому придется установить ее вручную.
В следующем примере демонстрируется сложная функция
zetarequire 'memoize'include Memoizedef zeta(x,y,z) lim = 0.0001 gen = 0 loop do gen += 1 p,q = x + y/2.0, z + y/2.0 x1, y1, z1 = p*p*1.0, 2*p*q*1.0, q*q*0.9 sum = x1 + y1 + z1 x1 /= sum y1 /= sum z1 /= sum delta = [[x1,x],[y1,y],[z1,z]] break if delta.all? {|a,b| (a-b).abs < lim } x,y,z = x1,y1,z1 end genendg1 = zeta(0.8,0.1,0.1)
