android – 在Random()方法中有没有一些模式?

android – 在Random()方法中有没有一些模式?,第1张

概述我开始做一个有山羊的项目!是的山羊 目前只有一个功能,当我点击一只山羊,它在随机位置创建另一只山羊. 我意识到有一种职位模式: 这是代码: public class GameActivity extends Activity { private int[] arrGoats = new int[5]; private RelativeLayout battlefield; 我开始做一个有山羊的项目!是的山羊
目前只有一个功能,当我点击一只山羊,它在随机位置创建另一只山羊.
我意识到有一种职位模式:

这是代码:

public class GameActivity extends Activity {    private int[] arrGoats = new int[5];    private relativeLayout battlefIEld;    @OverrIDe    protected voID onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentVIEw(R.layout.activity_game);        battlefIEld = (relativeLayout) findVIEwByID(R.ID.rel_battlefIEld);        arrGoats[0] = R.drawable.amarelo;        arrGoats[1] = R.drawable.azul;        arrGoats[2] = R.drawable.branco;        arrGoats[3] = R.drawable.verde;        arrGoats[4] = R.drawable.vermelho;        criarCabra(60,100);    }    private voID criarCabra(float x,float y) {        int cabraimg = arrGoats[new Random().nextInt(4)];        ImageVIEw cabra = new ImageVIEw(this);        cabra.setimageResource(cabraimg);        cabra.setX(x);        cabra.setY(y);        LayoutParams params = (LayoutParams) new LayoutParams(marginLayoutParams.WRAP_CONTENT,marginLayoutParams.WRAP_CONTENT);        params.wIDth = 150;        params.height = 120;        cabra.setLayoutParams(params);        cabra.setonClickListener(new OnClickListener() {            @OverrIDe            public voID onClick(VIEw v) {                criarCabra(new Random().nextInt(2000),new Random().nextInt(1000));            }        });        battlefIEld.addVIEw(cabra);    }}

我想知道为什么这个模式是创建的,尽管我使用Random().NextInt()来定义山羊的位置.

我疯了吗?

解决方法 首先,您每次都要创建一个新的Random对象.在AndroID中,initial seed is derived from current time and the identity hash code:
public Random() {     // Note: Using IDentityHashCode() to be hermetic wrt subclasses.     setSeed(System.currentTimeMillis() + System.IDentityHashCode(this));}

对于按顺序创建的两个对象,身份哈希码彼此靠近.在我的AndroID KitKat Dalvik VM上,我得到的差异仅为32的身份哈希码.

currentTimeMillis()也不会给种子带来很大的不同.

随机本身就是linear congruential generator的形式

random[i+1] = a * random[i] + b (mod c)

其中random [0]是种子,a,b和c是参数.

基于this answer,类似的种子确实在线性同余发生器中产生类似的结果:

The reason you’re seeing similar initial output from nextDouble given similar seeds is that,because the computation of the next integer only involves a multiplication and addition,the magnitude of the next integer is not much affected by differences in the lower bits.

因此,您的两个连续生成的具有默认种子的随机数将产生似乎相关的值,并使您的山羊定位在一条线上.

要修复它,使用与线性一致的相同的Random对象和/或更随机的伪随机生成器.

总结

以上是内存溢出为你收集整理的android – 在Random()方法中有没有一些模式?全部内容,希望文章能够帮你解决android – 在Random()方法中有没有一些模式?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1134130.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存