2013-06-07 2 views
0

У меня есть функция в моей модели, которая подсчитывает счет пользователя:Как проверить, работает ли функция логарифмически?

def score 
    (MULTIPLER * Math::log10(bets.count * summary_value ** accuracy + 1)).floor 
end 

Моя точка является, чтобы проверить, что он растет логарифмически?

+0

только что для уточнения вопроса: вы хотите проверить, является ли оценка функции O (log (n)) в переменной bets.count? Не уверен, что понимаю. – Massagran

+0

Я хочу проверить, что возвращаемое значение функции растет логарифмически в переменной 'bets.count'. – Hauleth

+0

, если вы хотите доказать аналитичность, это математический вопрос и не соответствует теме. Если вы хотите доказать численно, вы можете использовать графовый график, например rplot, и не является конструктивным - вы можете сохранить этот вопрос, отредактировав его и доказать, что я ошибаюсь. – fotanus

ответ

1

Пункт теста не должен доказывать, что он всегда работает (это область для статического ввода/проверки), но чтобы проверить, что он, вероятно, работает. Обычно это достаточно хорошо. Я предполагаю, что вы делаете это для игры, и что для обеспечения того, чтобы функция не «быстро развивалась».

Способ, которым мы могли бы это сделать, - попробовать несколько значений и проверить, следуют ли они общей логарифмической схеме.

В качестве примера рассмотрим чистую логарифмическую функцию f(x) = log(x) (любое основание):

If f(x) = y, то f(x^n) = f(x) * n.

Итак, если f(x^n) == (f(x) * n), то функция логарифмическая.

Сравните это с линейной функцией, например f(x) == x * 2. f(x^n) = x^n * 2, т.е. x^(n - 1) раз больше (намного больше).

У вас может быть более сложная логарифмическая функция, например f(x) = log(x + 7) + 3456. Шаблон все еще сохраняется, хотя и менее точно. Так что я сделал:

  1. Попытка вычислить постоянную величину, используя x = 1
  2. Найти разницу f(x^n) - f(x) * n.
  3. Найти абсолютную разницу f((x*100)^n) - f(100x) * n

Если (3)/(2) меньше, чем 10, то это почти наверняка не линейна, и, вероятно, логарифмическая. 10 - просто произвольное число.Большинство линейных функций будут отличаться более чем на миллиард. Даже такие функции, как sqrt(x), будут иметь большую разницу, чем 10.

Мой примерный код будет иметь метод score, чтобы принять параметр и протестировать его (чтобы он был простым + у меня нет вашего поддерживающего кода).

require 'rspec' 
require 'rspec/mocks/standalone' 

def score(input) 
    Math.log2(input * 3 + 1000 * 3) * 3 + 100 + Math.sin(input) 
end 

describe "score" do 
    it "grows logarithmacally based on input" do 
     x = 50 
     n = 8 
     c = score(1) 

     result1 = (score(x ** n) - c)/((score(x) -c) * n) 
     x *= 100 
     result2 = (score(x ** n) - c)/((score(x) -c) * n) 
     (result2/result1).abs.should be < 10 

    end 
end 
0

Хотя я почти забыл сложное математическое знание, кажется, факт не может помешать мне ответить на вопрос.

Мое предложение следующим образом

describe "#score" do 
    it "grows logarithmically" do 
    round_1 = FactoryGirl.create_list(:bet, 10, value: 5).score 
    round_2 = FactoryGirl.create_list(:bet, 11, value: 5).score 
    # Then expect some math relation between round_1 and round_2, 
    # calculated by you manually. 
    end 
end 
0

Вообще говоря, лучший способ увидеть, если функция растет, чтобы построить некоторые данные на графике. Просто используйте график построения графика и оцените результат.

логарифмическая функция всегда будет выглядеть следующим образом:

log func image http://www.sosmath.com/algebra/logs/log4/log004.gif

Вы можете настроить, как быстро она растет за счет ваших параметров, и Replot график, пока вы не нашли себя доволен результатом.

+0

Я знаю, как выбрать константы, которые подойдут для меня, но мне нужно проверить, что никто никогда не меняет это на то, что не является логарифмическим. – Hauleth

0

Если вам нужно рассматривать эту функцию как черный ящик, единственное истинное решение - получить кучу значений и посмотреть, хорошо ли их кривая хорошо аппроксимируется логарифмической кривой, фокусируясь на больших n. Если вы можете наложить на него разумные оценки, например a log(n) < score(n) < b log(n) для некоторых значений a и b, тогда вы можете просто проверить это.

Смежные вопросы