Пункт теста не должен доказывать, что он всегда работает (это область для статического ввода/проверки), но чтобы проверить, что он, вероятно, работает. Обычно это достаточно хорошо. Я предполагаю, что вы делаете это для игры, и что для обеспечения того, чтобы функция не «быстро развивалась».
Способ, которым мы могли бы это сделать, - попробовать несколько значений и проверить, следуют ли они общей логарифмической схеме.
В качестве примера рассмотрим чистую логарифмическую функцию 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
. Шаблон все еще сохраняется, хотя и менее точно. Так что я сделал:
- Попытка вычислить постоянную величину, используя
x = 1
- Найти разницу
f(x^n) - f(x) * n
.
- Найти абсолютную разницу
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
только что для уточнения вопроса: вы хотите проверить, является ли оценка функции O (log (n)) в переменной bets.count? Не уверен, что понимаю. – Massagran
Я хочу проверить, что возвращаемое значение функции растет логарифмически в переменной 'bets.count'. – Hauleth
, если вы хотите доказать аналитичность, это математический вопрос и не соответствует теме. Если вы хотите доказать численно, вы можете использовать графовый график, например rplot, и не является конструктивным - вы можете сохранить этот вопрос, отредактировав его и доказать, что я ошибаюсь. – fotanus