下面是我的代码,我尝试使用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();
}
}
答案 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中工作时,所有赌注都关闭了。
您可以尝试通过几种不同的方式对其进行调整。您可以: