有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java随机。nextInt()正在返回相同的数字

我的代码如下,我已经尝试使用随机类和数学。Random()方法。它在第一次呼叫时工作正常,但是当我在应用程序中单击“重试”按钮后尝试重播随机猜测游戏时,返回的号码相同

重试按钮调用TryAgain()

package com.example.austin.higherorlower;

import 安卓.support.v7.app.AppCompatActivity;
import 安卓.os.Bundle;
import 安卓.view.View;
import 安卓.widget.Button;
import 安卓.widget.EditText;
import 安卓.widget.Toast;

import java.util.Random;

public class MainActivity extends AppCompatActivity {

    int randNumber;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button tryAgain = findViewById(R.id.tryAgainButton);
        randNumber = returnRand();
    }

    public int returnRand(){
        Random rand = new Random();
        int randInt = rand.nextInt(20) + 1;
        Button tryAgain = findViewById(R.id.tryAgainButton);
        tryAgain.setVisibility(View.GONE);
        return randInt;
    }

    public void GuessRandom(View view) {

        EditText numberGuessedEdit = findViewById(R.id.guessedRandomValue);
        String numberGuessedString = numberGuessedEdit.getText().toString();
        int numberGuessed = Integer.parseInt(numberGuessedString);
        if (numberGuessed < randNumber) {
            Toast.makeText(getApplicationContext(), "Higher", Toast.LENGTH_SHORT).show();
        }
        else if(numberGuessed > randNumber) {
            Toast.makeText(getApplicationContext(), "Lower", Toast.LENGTH_SHORT).show();
        }
        else if(numberGuessed == randNumber){
            Toast.makeText(getApplicationContext(), "Correct! Try Again!", Toast.LENGTH_SHORT).show();
            Button tryAgain = findViewById(R.id.tryAgainButton);
            tryAgain.setVisibility(View.VISIBLE);
        }
    }

    public void TryAgain(View view){
        returnRand();
    }
}

共 (4) 个答案

  1. # 1 楼答案

    您是否尝试过导入数学类并调用Math.random()?它返回一个介于0.0和1.0之间的浮点数,您可以使用Math.floor(20*Math.random()) +1获得一个介于1和20之间的随机数(它将是一个保存为浮点数的整数)

  2. # 2 楼答案

    我不认为使用随机对象有什么不对;然而,Elliott Frisch可能是对的,简单地在无参数构造函数中构造Random可能会一次又一次地使用相同的种子。我所知道的是,这不是它在Java世界中的工作方式(请参阅Random上的javadocs,这是非常彻底的),但是当您在Android中工作时,所有的赌注都没有了

    你可以尝试用几种不同的方法来调整它。你可以:

    1. 声明一个实例变量,而不是一个方法声明。这样,随后的兰德电话。nextInt将处于一个公共的随机上下文中,并且不再使用完全相同的种子重新开始(如果这确实是问题的话)
    2. 使用种子构造函数实例化Random。在这里使用的一个好的种子是系统。currentTimeMillis(),因为这将保证每时每刻都不同
    3. 同时做1和2
  3. # 3 楼答案

    如果你在随机课上遇到问题,我建议你使用数学课。 我发现一个很好的函数可以帮助你

    int myRand(int i_from, int i_to) {
        return (int)(Math.random() * (Math.abs(i_from - i_to) + 1)) + Math.min(i_from, i_to);
    }
    
  4. # 4 楼答案

    这里不要使用Random,在循环中重新创建Random将拾取相同的种子,这将使它完全不是随机的。幸运的是,有^{}可以作为替代品使用。像

    int randInt = ThreadLocalRandom.current().nextInt(20) + 1;