Alb*_*ola 6 delphi android firemonkey
我正在开发一款适用于Windows和Android的游戏,但它有一个我无法解决的问题.基本上我有一个带有一些按钮的4x5网格,这些按钮每秒填充一个必须为2,4或8的随机数.如果点击两个具有相同数字的按钮,则计算总和.这是一个firemonkey项目.
游戏运行正常,但您可以在下面的图片中看到问题.当我在我的Windows机器运行游戏,它产生2,4或8的android下它会产生2,4,7和8随机数以这种方式创建:
valueToOutput := Trunc(Exp(Ln(2) * (1+Random(3))));
Run Code Online (Sandbox Code Playgroud)
该变量保存要在按钮中显示的数字.为什么我在windows和android中得到不同的结果?这是两个截图
我确信该函数是正确的,因为我已经绘制了它(exp(ln(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;
Run Code Online (Sandbox Code Playgroud)
对于相同的浮点控制状态,浮点计算对于相同的输入是可重复的.
因此,使用三个不同的输入,您的表达式应具有三个不同的可能输 因此,唯一的解释是在程序执行期间某些东西改变了浮点控制状态,例如舍入模式,精度等.
如果浮点运算可以精确地执行计算,则不需要舍入到整数.但是,如果你必须圆,至少圆到最近使用Round而不是Trunc.
也就是说,这绝对是执行随机选择2,4和8之一的离散任务的错误方法.这样做:
case Random(3) of
0:
Result := 2;
1:
Result := 4;
2:
Result := 8;
end;
Run Code Online (Sandbox Code Playgroud)
另一种方法是将可能的输出放入一个数组中,然后像这样选择它们:
Result := arr[Random(3)];
Run Code Online (Sandbox Code Playgroud)
当有更多值可供选择时,这会变得更有吸引力.
一个黄金法则是,如果你可以避免使用浮点这样做.浮点比整数算术更慢,更难以推理.仅在必要时使用它.
| 归档时间: |
|
| 查看次数: |
200 次 |
| 最近记录: |