gpt4 book ai didi

android - Random() 方法有一些模式吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:04:18 25 4
gpt4 key购买 nike

我开始做一个有山羊的项目!是的山羊。目前只有一个功能,当我点击一只山羊时,它会在Random 位置创建另一只山羊。我意识到有一个职位模式:

I've made red lines on patterns

代码如下:

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] 是种子,abc 是参数。

基于 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 将产生看似相关的值,并使您的山羊排在一条线上。

要修复它,请使用相同的 Random 对象和/或比线性同余生成器更随机的伪随机生成器。

关于android - Random() 方法有一些模式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25893675/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com