Java 每次调用方法时的随机数
!![尖叫声][1]] 是否每次调用下面的Java 每次调用方法时的随机数,java,android,loops,Java,Android,Loops,!![尖叫声][1]] 是否每次调用下面的gamePlay()方法时,我都可以生成一个不同的数字作为x,介于0和3之间?gameplay方法在循环中,我希望它能够在每次调用该方法时,为0到3之间的x创建一个新值。我尝试了很多东西,比如下面代码中的随机生成器,但我无法理解 public class MainActivity extends AppCompatActivity { final Handler h = new Handler(); RelativeLayout rLa
gamePlay()
方法时,我都可以生成一个不同的数字作为x,介于0和3之间?gameplay
方法在循环中,我希望它能够在每次调用该方法时,为0到3之间的x创建一个新值。我尝试了很多东西,比如下面代码中的随机生成器,但我无法理解
public class MainActivity extends AppCompatActivity {
final Handler h = new Handler();
RelativeLayout rLayout;
Button play, retry;
TextView title, lose, score;
ImageView rc, gc, bc, yc, tyc, trc, tgc, tbc,tblc;
int gscore = 0;
protected void gamePlay(){
x = r.nextInt(4);
if(x == 0){
tbc.setVisibility(View.VISIBLE);
}
else if(x == 1){
tgc.setVisibility(View.VISIBLE);
}
else if(x == 2){
trc.setVisibility(View.VISIBLE);
}
else if(x == 3){
tyc.setVisibility(View.VISIBLE);
}
rLayout.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if(x == 0){
if(tbc.getY() < bc.getY()+50 && tbc.getY() > bc.getY()-50){
gscore = gscore+1;
score.setText(String.valueOf(gscore +""));
tgc.setY(tblc.getY());
tbc.setY(tblc.getY());
trc.setY(tblc.getY());
tyc.setY(tblc.getY());
}
else{
gameLost();
}
}
else if(x==1)
if(tbc.getY() < gc.getY()+50 && tbc.getY() > gc.getY()-50){
gscore = gscore+1;
score.setText(String.valueOf(gscore+"" ));
tgc.setY(tblc.getY());
tbc.setY(tblc.getY());
trc.setY(tblc.getY());
tyc.setY(tblc.getY());
}
else{
gameLost();
}
else if(x==2)
if(tbc.getY() < rc.getY()+50 && tbc.getY() > rc.getY()-50){
gscore = gscore+1;
score.setText(String.valueOf(gscore +""));
tgc.setY(tblc.getY());
tbc.setY(tblc.getY());
trc.setY(tblc.getY());
tyc.setY(tblc.getY());
}
else{
gameLost();
}
else if(x==3)
if(tbc.getY() < yc.getY()+50 && tbc.getY() > yc.getY()-50){
gscore = gscore+1;
score.setText(String.valueOf(gscore +""));
tgc.setY(tblc.getY());
tbc.setY(tblc.getY());
trc.setY(tblc.getY());
tyc.setY(tblc.getY());
}
else{
gameLost();
}
}
});
}
public类MainActivity扩展了AppCompatActivity{
最终处理程序h=新处理程序();
相对布局;
按钮播放,重试;
文本查看标题、失败、分数;
ImageView rc、gc、bc、yc、tyc、trc、tgc、tbc、tblc;
int gscore=0;
受保护的虚拟游戏(){
x=r.nextInt(4);
如果(x==0){
tbc.setVisibility(视图可见);
}
else如果(x==1){
设置可见性(View.VISIBLE);
}
else如果(x==2){
trc.setVisibility(视图可见);
}
else如果(x==3){
tyc.setVisibility(视图可见);
}
rLayout.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图v){
如果(x==0){
if(tbc.getY()bc.getY()-50){
gscore=gscore+1;
score.setText(String.valueOf(gscore+);
tgc.setY(tblc.getY());
tbc.setY(tblc.getY());
trc.setY(tblc.getY());
tyc.setY(tblc.getY());
}
否则{
gameLost();
}
}
else如果(x==1)
if(tbc.getY()gc.getY()-50){
gscore=gscore+1;
score.setText(String.valueOf(gscore+);
tgc.setY(tblc.getY());
tbc.setY(tblc.getY());
trc.setY(tblc.getY());
tyc.setY(tblc.getY());
}
否则{
gameLost();
}
else如果(x==2)
if(tbc.getY()rc.getY()-50){
gscore=gscore+1;
score.setText(String.valueOf(gscore+);
tgc.setY(tblc.getY());
tbc.setY(tblc.getY());
trc.setY(tblc.getY());
tyc.setY(tblc.getY());
}
否则{
gameLost();
}
else如果(x==3)
if(tbc.getY()yc.getY()-50){
gscore=gscore+1;
score.setText(String.valueOf(gscore+);
tgc.setY(tblc.getY());
tbc.setY(tblc.getY());
trc.setY(tblc.getY());
tyc.setY(tblc.getY());
}
否则{
gameLost();
}
}
});
}
问题在于,每次调用gamePlay()
时,您都在使用相同的种子创建一个新的随机数生成器。这将每次为您提供相同的随机数序列。保证
使包含随机数生成器的变量引用一个实例变量,并初始化它一次
另外,Random.nextInt(4)
将返回0、1、2或3。我不知道您所说的“介于0和4之间”是否就是这个意思
我建议您花点时间阅读forRandom
有人建议您可以删除
Random
构造函数的seed
参数。但是,这意味着您每次都会从操作系统获得一个随机种子。这相对昂贵,并且(在某些情况下)会因耗尽操作系统的熵源而导致问题
在由用户事件触发呼叫的Android AP中,这可能没问题。但这不是一个好主意。如果您想获得介于
0
和4
之间的随机数,请将参数更改为5
返回0到0之间的伪随机、均匀分布的int值
(含)和规定值(不含)
同时删除最后一个关键字,因为您希望即使在分配了值之后也能更改它
如果它给了你一个错误,那么把它作为一个字段变量,不要把它设为最终变量。这应该可以解决你的问题
...
}
});}
Random r = new Random(seed+gscore);
//initialize it in constructor below `seed` and `gscore` variables;
private int x; //move the declaration to class instead of method
protected void gamePlay(){
x = r.nextInt(5);
...
此外,您只需要设置一次种子。如果您总是设置种子,那么它将继续给您相同的答案 看
编辑 您还可以切换到
Math.random()
生成随机数
x = (int)(Math.random()*10)%5;
我在下面的代码中尝试了很多东西,比如随机生成器,但我没有弄明白。
你遇到了什么问题random.nextInt()
?出于某种原因,它一直给我相同的值删除final
行中的final int x=r.nextInt(4);
然后它在x的内部rLayout上给了我一个错误。setonclick只需删除随机成本结构中的种子,或者看看我是如何根据建议编辑代码的,但它仍然生成与我更新原始帖子相同的数字,而且我想要数字0,1,2,3。@z123请参见编辑后的答案。您只需要设置一次种子。如果您设置过种子,请每次,它都会给你同样的答案。我想我明白你的意思了。我在帖子上编辑了我的代码,看看是否是你说的。我在类外部方法中将r和x声明为实例变量,并在gamePlay方法中对它们进行初始化。@z123请将r=new Random();
也移至方法外部。如果你继续
x = (int)(Math.random()*10)%5;