Java 二维数组,正在分配随机值而不是应该分配的值

Java 2D Array, Random value is getting assigned rather than the value that is supposed to be

编辑3:这个问题已经回答了。我多次做错了数学并犯了一个大错误,因此没有意识到代码库本身很好

关于 Whosebug 的第一个问题。

所以我正在 运行 宁模拟,在我的代码中我需要模拟资源折旧,这很简单,减少 25%。简单的。但出于某种原因,每次当我尝试将值更改为 2D 数组中原始值的 75% 时,它都会将其更改为 100,而不是任何数字。当我打印出我设置它等于的值时,它给了我正确的数字,但当我实际设置它时,它只是变成了 100。任何提示或帮助将不胜感激。

顺便说一句,数组是全局的,并且是受保护的 int 类型的二维数组。

代码片段:所以在这个代码片段中,当实际赋值被注释掉时,System.out.println 打印出正确的值,但当实际赋值时它变为 100。

我已经尝试了几个选项,并且仍在尝试修复它,但我很想知道以前是否有人 运行 遇到过类似的问题?

编辑:我已经更新了数组的声明和数组被更改的唯一其他函数。在资源提取函数之后数组值很好,但是在消耗函数期间,当我尝试分配一个当前所持资产的 75% 的新价值。

所以例如,数组中的数字是 4000,那么在消费之后它应该是 3000,但是那行打印出 72 而不是 3000,因为 72 是 t[=42 之后的 97 的 3/4 =]阳离子。但是当分配被注释掉并且 运行 时,所有数字都正确地增加到任何数字,例如 4869。

编辑 2:

我已经发布了我的全部代码。一遍又一遍模拟运行。因此,提取和消耗是 运行 一遍又一遍。我已经计算过,我发布的错误仍然存​​在,并且只会根据代理和资源的数量而变化。

例如。 agent = 24 和 resource = 24,然后经过几次迭代后,由于某种原因它的上限为 24,而当 agent = 8 和 resource = 8 时,它的上限为 72。 我确实为此做了数学计算,并且由于公式的工作原理,它们不应该在每次迭代中获得相同的数量,直到达到像 10000 这样的非常高的数字。

抱歉所有的冗长,我感谢迄今为止得到的所有帮助!

想不通,大概跟数组类型有关。

resourcesHeld[i][j] * 3 / 4是表达式类型,使用System.out.println(expr)会使用其中一种方法匹配你的表达方式

将其重新分配给 resourcesHeld 可能会强制将值强制转换为数组类型,从而迫使它更改值。

现在我假设如果 java 需要将值缩小到类型,您会得到异常或编译错误。

以下按预期工作:

public class SO1 {

    int agentCount = 1;
    int resourceCount = 1;
    int[][] resourcesHeld = new int[agentCount][resourceCount];

    public void resourceConsumption() {
        for (int i = 0; i < agentCount; i++) {
            for (int j = 0; j < resourceCount; j++) {
                resourcesHeld[i][j] = resourcesHeld[i][j] * 3 / 4;
            }
        }
    }

    public static void main(String[] args) {
        SO1 s = new SO1();

        s.resourcesHeld[0][0] = 4000;
        s.resourceConsumption();
        System.err.println(s.resourcesHeld[0][0]); // 3000
    }
}

我怀疑 resourcesHeld 中的值不是您在 resourceConsumption() 调用之前认为的值,或者您稍后修改了它们。

您能否修改您的代码以验证:

public void resourceConsumption() {
    for (int i = 0; i < agentCount; i++) {
        for (int j = 0; j < resourceCount; j++) {
            System.err.println("BEFORE: " + resourcesHeld[i][j]);
            resourcesHeld[i][j] = resourcesHeld[i][j] * 3 / 4;
            System.err.println("AFTER: " + resourcesHeld[i][j]);

        }
    }
}

编辑

好吧,看起来(在 8 个代理的情况下)在 step() 的一些迭代之后 resourcesHeld 的值是 97。然后 resourceConsumption() 下降到 72,然后 resourceExtract() 将其调回 97。

换句话说,在某些时候 resourceExtract()resourcesHeld 的值增加 3/4,而 resourceConsumption() 将它们减少 3/4。从这一点开始,您将在这两个值之间摇摆不定。