Я разрабатываю игру, которая работает на Windows и Android, но у нее есть проблема, которую я не могу решить. В основном у меня есть сетка 4x5 с некоторыми кнопками, и эти кнопки заполняются каждую секунду случайным числом, которое должно быть 2, 4 или 8. Если вы нажмете на две кнопки с одинаковым номером, сумма будет рассчитана. Это проект firemonkey.Странные значения для математического выражения
Игра прекрасно работает, но вы можете увидеть эту проблему на рисунках ниже. Когда я запускаю игру в моем окне машины он генерирует 2, 4 или 8. В соответствии с андроидом Он генерирует 2, 4, 7 и 8. Случайные числа созданы таким образом:
valueToOutput := Trunc(Exp(Ln(2) * (1+Random(3))));
Этих переменный держит номер, который будет отображаться на кнопке. Почему у меня разные результаты в Windows и Android? Эти две картинки
- для Windows 32-бит: http://prnt.sc/dmd1ry
- Android планшет: http://prnt.sc/dmd5uj
Я уверен, что функция является правильным, потому что изобразили его (ехр (п (2) * (1 + x)) = http://prnt.sc/dmdc3u), а когда x равно 0,1 или 2 (= когда случайное число равно 0,1 или 2). Может ли это быть проблемой с компилятором?
Примечание: Я уже решил эту проблему, используя обходное решение, которое вы можете видеть ниже, но сначала я использовал код, который вы можете увидеть в проблеме, и я хотел бы понять, что происходит.
valueToOutput := Trunc(Exp(Ln(2) * (1+Random(3))));
//this will always give 2, 4 or 8
if valueToOutput = 7 then
valueToOutput := valueToOutput + 1;
Как насчет просто 'valueToOutput: = 2 shl Random (3)'? Затем вы можете пропустить все мусор с плавающей запятой. –
Да, конечно, это очень хорошее решение (также быстрее, чем умножение), но я хотел знать об этой формуле. Я хотел знать, была ли потеря точности только в android. –
Что такое 'sizeof (Extended)' на Android? На Win32 это 10, но на Win64 это 8. Может быть, аналогичная потеря точности на мобильном? Он не документирован в DocWiki от Embarcadero. –