Random.nextInt()返回相同的数字

时间:2018-11-25 19:55:11

标签: java android

下面是我的代码,我尝试使用Random类和Math.Random()方法。第一次通话时效果很好,但是当我在应用程序中单击“重试”按钮后尝试重播随机猜谜游戏时,会返回相同的数字。

“再试一次”按钮调用TryAgain()

package com.example.austin.higherorlower;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.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 个答案:

答案 0 :(得分:3)

这里不要使用Random,在循环中重新创建Random将会选择相同的 seed ,这将使其完全不是随机的。幸运的是,您可以使用ThreadLocalRandom作为替换品。喜欢,

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

如果您在使用Random类时遇到麻烦,建议您使用Math类。 我发现一个不错的功能可以为您提供帮助。

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);
}

答案 3 :(得分:0)

我认为使用Random对象没有任何问题。但是Elliott Frisch可能是正确的,因为以某种方式在无参数构造函数中简单地构造Random可能会一次又一次地使用相同的种子。我所知道的是,这不是它在Java世界中的工作方式(请参阅Random上的javadocs,它非常详尽),但是当您在Android中工作时,所有赌注都关闭了。

您可以尝试通过几种不同的方式对其进行调整。您可以:

  1. 声明随机一个实例变量而不是一个方法声明。这样,对rand.nextInt的后续调用将在一个通用的Random上下文中进行,而不会再次从完全相同的种子开始(如果确实存在问题)。
  2. 使用种子构造函数实例化Random。这里使用的一个很好的种子应该是System.currentTimeMillis(),因为可以保证它有时会有所不同。
  3. 同时执行1和2。