【问题标题】:Random Generator - carrying over variables随机生成器 - 携带变量
【发布时间】:2026-02-23 18:50:01
【问题描述】:

有人可以帮忙吗? 我刚刚开始进行一些非常基本的 android 开发。我正在开发一个初始应用程序来帮助我的女儿学习她的乘法表。想法是(在它的第一个版本中)随机生成 1 到 12 之间的 2 个数字。然后单击一个计算按钮,它会给出答案。 我有它,所以它随机生成 2 个数字,但是,当我单击计算时,它不计算,只显示 0。 我相信这与下一个方法(计算)看不到的变量(数字1和数字2)的值有关。如果我将 2 个数字硬编码到计算方法中,它就可以工作。我只是无法计算随机生成的数字。 非常感激任何的帮助。 MainActivity.java:

package uk.co.myrayner.sophiestimestables;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;

import java.util.Random;


public class MainActivity extends AppCompatActivity {

    int digit1;
    int digit2;
    int show_answer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void randomise_digits(View view) {
        Random rand1 = new Random();
        int digit1 = rand1.nextInt(12) + 1;
        displaydigit1(digit1);
        Random rand2 = new Random();
        int digit2 = rand2.nextInt(12) + 1;
        displaydigit2(digit2);
    }

    public void calculate(View view) {
        show_answer = (digit1 * digit2);
        displayanswer(show_answer);
    }

    private void displaydigit1(int number) {
        TextView digit1TextView = (TextView) findViewById(R.id.digit1);
        digit1TextView.setText("" + number);
    }

    private void displaydigit2(int number) {
        TextView digit2TextView = (TextView) findViewById(R.id.digit2);
        digit2TextView.setText("" + number);
    }

    private void displayanswer(int number) {
        TextView answerTextView = (TextView) findViewById(R.id.show_answer);
        answerTextView.setText("" + number);

    }
}

【问题讨论】:

  • calculate() 没有生成随机数,randomise_digits 正在生成数字。检查点击处理程序是否设置正确

标签: java android variables random


【解决方案1】:

您的实现存在几个问题。

1) 在您的 randomise_digits 中,您正在设置 digit1 和 digit2 的值,但这些是局部变量,而不是在方法之外声明的实例变量。因此,对 randomise_digits() 中 digit1 和 digit2 的任何更改都不会反映在 MainActivity 对象的 digit1 和 digit2 上。这就是为什么您得到 0 的原因,因为它们实际上没有设置为任何值(因为您在 calculate() 方法中引用了 digit1 和 digit2 的实例变量)。您的 randomise_digits() 方法中的本地 digit1 和 digit2 现在超出范围/不再存在。

2) 更改方法的名称以更好地反映他们在做什么。您的 calculate() 方法可能应该重命名为 show()。您不需要将 View 对象作为所有方法的参数传入。您没有使用它们,为什么要包含它们?

3) 你不需要创建两个随机对象来计算两个随机数。一个就可以了。

你的班级应该是这样的:

package uk.co.myrayner.sophiestimestables;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;

import java.util.Random;


public class MainActivity extends AppCompatActivity {

    int digit1;
    int digit2;
    int show_answer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button calculateButton = findViewById(R.id.your_calculate_button_id);

        calculateButton.setOnClickListener(new Button.OnClickListener() {

            public void onClick(View v) {
                randomise_digits();
                calculate();
            }

        });
    }

    public void randomise_digits() {
        Random rand1 = new Random();
        digit1 = rand1.nextInt(12) + 1;
        displaydigit1(digit1);
        digit2 = rand1.nextInt(12) + 1;
        displaydigit2(digit2);
    }

    public void calculate() {
        show_answer = (digit1 * digit2);
        displayanswer(show_answer);
    }

    private void displaydigit1(int number) {
        TextView digit1TextView = (TextView) findViewById(R.id.digit1);
        digit1TextView.setText("" + number);
    }

    private void displaydigit2(int number) {
        TextView digit2TextView = (TextView) findViewById(R.id.digit2);
        digit2TextView.setText("" + number);
    }

    private void displayanswer(int number) {
        TextView answerTextView = (TextView) findViewById(R.id.show_answer);
        answerTextView.setText("" + number);

    }
}

如果您决定复制并粘贴上面的代码,请确保删除活动布局 xml 中的所有 onclick 事件。

【讨论】:

  • 非常感谢,通过从 randomise_digits 方法中删除 int 使其工作。
【解决方案2】:

您需要做的就是在定义 digit1 和 digit2 之前删除“int”,这样您的代码应该如下所示:

package uk.co.myrayner.sophiestimestables;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;
import java.util.Random;

public class MainActivity extends AppCompatActivity {

    int digit1;
    int digit2;
    int show_answer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void randomise_digits(View view) {
        Random rand1 = new Random();
        digit1 = rand1.nextInt(12) + 1;
        displaydigit1(digit1);
        Random rand2 = new Random();
        digit2 = rand2.nextInt(12) + 1;
        displaydigit2(digit2);
    }

    public void calculate(View view) {
        show_answer = (digit1 * digit2);
        displayanswer(show_answer);
    }

    private void displaydigit1(int number) {
        TextView digit1TextView = (TextView) findViewById(R.id.digit1);
        digit1TextView.setText("" + number);
    }

    private void displaydigit2(int number) {
        TextView digit2TextView = (TextView) findViewById(R.id.digit2);
        digit2TextView.setText("" + number);
    }

    private void displayanswer(int number) {
        TextView answerTextView = (TextView) findViewById(R.id.show_answer);
        answerTextView.setText("" + number);

    }
}

【讨论】:

    【解决方案3】:

    我没有在我的机器上测试你的代码。但我认为这可能是由于您没有设置全局变量“digit1”和“digit2”的值。 在您的方法“randomise_digits”中,您只需创建新的局部变量“digit1”和“digit2”。

    【讨论】:

      【解决方案4】:

      好吧,我没有测试您的代码,但显然,您将 digit1digit2 声明为全局变量,但是当您使用它时,您再次声明了它,所以现在代码将生成随机数并分配给本地digit1digit2 而不是全局,当您尝试调用calculate() 时,全局digit1digit2 仍然为0(默认情况下原始整数为零)所以基本上结果将为零。

      只需将 randromise_digits 函数修改为

      public void randomise_digits(View view) {
          Random rand1 = new Random();
          digit1 = rand1.nextInt(12) + 1;
          displaydigit1(digit1);
          Random rand2 = new Random();
          digit2 = rand2.nextInt(12) + 1;
          displaydigit2(digit2);
      }
      

      【讨论】: