概率:我们通常使用spawnChance来表达产生几率,它大部分上一章随机数相似,不再说明,

这是它调用的方法。

public static final int a(ah ahVar, int i, int i2, int i3) {
        k t = k.t();
        if (i < i2) {
            int i4;
            int i5 = t.bu + 1;
            int i6 = (int) (((float) ((int) (((float) ((int) (((float) ((int) (((float) ((int) (((long) t.bG) + (1313 * ahVar.ej)))) + (ahVar.eq * 13.0f)))) + (ahVar.er * 13.0f)))) + (ahVar.eq * 130.0f)))) + (ahVar.er * 130.0f));
            if (ahVar instanceof ce) {
                i4 = ((ce) ahVar).bE;
                i4 = (i4 * i5) + (i6 + (i4 * 13131));
            } else {
                i4 = i6;
            }
            i4 = ((((int) (((long) (i4 + ((i3 * 133) * i2))) + ((((long) i3) * ahVar.ej) + ((long) i3)))) + ((i5 * 1313) * i3)) + ((i5 * 13) + (i5 % 10))) % (i2 - i);
            if (i4 < 0) {
                i4 = -i4;
            }
            return i + i4;
        } else if (i <= i2) {
            return i;
        } else {
            k.b("min>max");
            return i;
        }
    }

ej是id,eq是y,er是x,不过这些值很大可能没有初始化,而无法影响i4的值。

其中i4由单个spawnUnits生成次影响,这使多个spawnUnits生成结果相同。

它的生成范围是不均匀的,如果统计它的生成状况的话可能不会得到较好的效果。

为避免生成结果相同,打乱循序的开销最小,不过这需要你根据权重重新分配概率,且存在规律。

随机偏移:offRandomX/Y/XY也使用这个函数,它的生成范围是一个矩形。

在生成前添加一些无用的空项,影响i4的值也是一个解决办法,不过这可能引起性能问题。spawnUnits:dummyNonUnitWithTeam*2(spawnChance=0)

诺使用延迟来避免它,过小是不适合的,这只会加上游戏帧影响的一个乘数,使它们从左上到右下生成连起来就是一条斜线。

因此需要等待游戏更新种子后再生成,游戏更新种子的时间是不确定的,它可能在200~300区间,选择300延迟较稳定。

你可以使用spawnSource避免这糟糕的随机数生成器,不过这又涉及rnd生成相同的问题。