Java 每次调用方法时的随机数

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

!![尖叫声][1]]

是否每次调用下面的
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之间”是否就是这个意思

我建议您花点时间阅读for
Random


有人建议您可以删除
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;