【问题标题】:Java 2D Array, Random value is getting assigned rather than the value that is supposed to beJava 2D 数组,随机值被分配而不是应该的值
【发布时间】:2018-09-09 04:03:13
【问题描述】:

编辑 3:此问题已得到解答。我多次计算错误并犯了一个大错误,因此没有意识到代码库本身很好

关于stackoverflow的第一个问题。

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

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

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

我尝试了一些选项,但仍在尝试修复它,但我很想知道是否有其他人以前遇到过类似的问题?

编辑:我已经更新了数组的声明以及数组被更改的唯一其他函数。在资源提取函数之后数组值很好,但是在消耗函数期间,当我尝试分配一个新值时,一切都会出错占当前持有量的 75%。

例如,数组中的数字是 4000,那么在消耗之后它应该是 3000,但是那一行只打印出 72 而不是 3000,因为 72 是截断后 97 的 3/4。但是,当赋值被注释掉并运行时,所有数字都会正确地递增到任何数字,例如 4869。

编辑2:

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

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

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

【问题讨论】:

  • 数组是全局的吧?您能否展示其他可能更改数组的地方
  • 提供有关问题的更多信息
  • resourcesHeld 的类型是什么?
  • 所以下面的代码打印 100 ?资源持有[i][j] = 资源持有[i][j] * 3 / 4; System.out.println(resourcesHeld[i][j]);而resourcesHeld[i][j]中的初始值不是134?
  • @DavidSoroko 打印出 72,并且在消费函数中值不断变为 97。

标签: java arrays eclipse multidimensional-array repast-simphony


【解决方案1】:

以下按预期工作:

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。从这一点开始,你在这两个值之间摇摆不定。

【讨论】:

  • 我已经验证消费是正确的。因此,按照这种情况,我会怀疑 resourcesHeld 中的值要么获得相同的数量,要么失去模拟的每次迭代。我稍后会修改这些值,因为它是一个模拟,所以消耗和提取会一遍又一遍地运行。
【解决方案2】:

我想不到,它可能与数组类型有关。

resourcesHeld[i][j] * 3 / 4 是具有表达式类型的表达式,使用 System.out.println(expr) 将使用与您的 expr 匹配的方法之一。

将其分配回 resourcesHeld 可能会强制将值强制转换为数组类型,从而强制其更改值。

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

【讨论】:

    猜你喜欢
    • 2014-12-29
    • 2022-11-14
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    • 1970-01-01
    • 2012-02-05
    • 2017-02-14
    • 2021-06-05
    相关资源
    最近更新 更多