Я пытаюсь рассчитать ожидаемый «счет» для данного игрока в системе Эло*.
Проблемная строка кода выглядит следующим образом:
expected(0) = (1 / (1 + (10 ^ (1000 - 1000) / 400)))
Когда я возвращаю значение expected(0) сразу после этой строки в виде msgbox в приложении Windows Forms, оно указывает, что значение равно 11, хотя оно должно быть 1 (expected(1) объявлен как массив целых чисел).
Когда я запускаю эту же строку кода в консольном приложении, она возвращает 1.
Есть ли причина, по которой эта строка кода вместо этого возвращает 11?
Обновлено: точный код подпрограмм как для консольного приложения, которое я тестировал (которое возвращает правильное значение), так и для приложения форм:
Формы:
Dim expected(1) As Integer
expected(0) = (1 / (1 + (10 ^ (1000 - 1000) / 400)))
Msgbox(expected(0))
Консоль:
Dim t(1) As Integer
t(0) = (1 / (1 + (10 ^ (1000 - 1000) / 400)))
Console.WriteLine(t(0))
Console.ReadLine()
Приведенные выше числовые значения (например, 400, 1000) буквально записываются в программу вот так, поскольку я просто проверял, работают ли они.
* вы можете посмотреть уравнение на странице википедии «Система рейтинга Эло», но я не думаю, что это важно в этой ситуации. В этой ситуации я моделирую, что у обоих игроков Эло равен 1000.
Мне нужно изменить много вещей во всей моей программе, если я установлю Option Strict On, но я отредактирую, чтобы показать код.
Тогда в вашем приложении, скорее всего, есть много ненадежных вещей.
Хорошо, но как эта опция влияет на приведенный выше код?
Это не так. То, что у вас есть, или правильное t(0) = CInt((1 / (1 + (10 ^ (1000 - 1000) / 400)))) не воспроизводит этот результат. Я сомневаюсь, что это ваш настоящий код и эти настоящие значения, а также потому, что это: (10 ^ (1000 - 1000) — это просто 1, я не понимаю, зачем вам все это, чтобы просто добавить 1. Эти ценности, вероятно, приходят откуда-то еще, в другой форме.
Пришлите мне свой код Windows, и я буду рад изучить его. Получить 11 невозможно.
@Jacob Я тестирую приложение формы, и оно правильно возвращает 1. Как вы получили «11» в своем тесте?
@XingyuZhao, было бы неплохо показать код, как вы получили «1».
@Jimi эти значения буквально записаны в программе именно так, как я написал выше; они нигде не объявлены, это просто числа. Причина, по которой у меня есть все это, чтобы просто добавить 1, заключается в том, что эти значения должны быть переменными, но они не работали, поэтому я изменил их на «1000», чтобы проверить это, и обнаружил, что это все еще не работает.
Я рад слышать, что ваша проблема решена, вы можете нажать «✔», чтобы отметить свой ответ как ответ.
Ваша формула из Википидии:
Один из способов точно закодировать это:
Dim d1 As Double = (Rb - Ra) / 400R '0
Dim d2 As Double = 1 + System.Math.Pow(10, d1) '2
Dim EA As Double = 1 / d2 '0.5
Ваше выражение:
(1 / (1 + (10 ^ (1000 - 1000) / 400)))
Не является точным переводом исходного форумала выше, ваше выражение выше возвращает ноль вместо 0,5. Если EA является целым числом, вы получите одинаковый результат в обоих вычислениях, но я думаю, что вы всегда должны получать правильное значение, а затем явно манипулировать им, а не манипулировать им неявно (например, компилятором).
Установите Option Strict On и, возможно, опубликуйте фактический код, который генерирует эти значения.