在随机化的数组中使用数字Randoms

时间:2012-05-01 09:18:11

标签: java arrays 2d

我正在为一个小项目做一个小班。这是一个基于文本的RPG游戏,我正在尝试为NPC的死亡创建一个drop class。我已经创建了一些Math.random方法(它们完全相同,只是为了方便起见。)为项目ID(名称)删除随机数量,并获得项目的稀有性。一切正常,但它只随机化一次(在启动或运行时),并且在此之后它不会随机化数量。我也在2个数字之间随机化,例如25和50,随机不低于25或高于50。

我的问题是:如何在每次NPC死亡后随机化二维数组或一般数组中的整数,因此首次获得的随机数会发生变化而不会保持不变。因为现在,它保持在数字选择。如果数字是25,那么下一个npc我杀了,数量仍然是25 ..和25 ..和25 ..等等。我需要它随机化或改变。<​​/ p>

请帮助,谢谢。

   public class DropConfig {

    private static final int
        ALWAYS = 0,
        VERY_COMMON = rate(1, 9),
        COMMON = rate(10, 20),
        UNCOMMON = rate(30, 40),
        RARE = rate(50, 60),
        VERY_RARE = rate(70, 80),
        SUPER_RARE = rate(90, 100);

    public static final int[][] NPC_DROPS = {

        // Normal NPC's
        {1, 526, 1, ALWAYS}, 
        {2, 526, 1, ALWAYS}, 
        {3, 526, 1, ALWAYS}, 
        {1, 995, drop(1, 50), ALWAYS}, 
        {2, 995, drop(1, 50), ALWAYS},
        {3, 995, drop(1, 50), ALWAYS},

        // Moderate NPC's
        {9, 526, 1, ALWAYS}, 
        {9, 995, drop(250, 500), UNCOMMON},
        {9, 555, drop(2, 7), VERY_COMMON},
        {9, 995, drop(5, 50), VERY_COMMON},
        {9, 1050, 1, RARE}, 
    };

    public static int rate(int min, int max) {
        return 1 + (int)(Math.random() * ((max - min) + 1));
    }

    //Same as rate, different name for looks.
    public static int drop(int min, int max) {
        return 1 + (int)(Math.random() * ((max - min) + 1));
    }

下面我称之为drop方法

public void npcDeath() {
    int npc = 0;    
    if (npc == null)
        return;
    for(npc = 0; npc < DropConfig.NPC_DROPS.length; npc++) {
        if(npc == DropConfig.NPC_DROPS[npc][0]) {
            if(Misc.random(DropConfig.NPC_DROPS[npc][3]) == 0) { //Drops ALWAYS item
                Item(DropConfig.NPC_DROPS[npc][1], DropConfig.NPC_DROPS[npc][2]);
            }
        }
    }
}

3 个答案:

答案 0 :(得分:1)

如果我理解正确,您希望每次使用此NPC_DROPS数组时,通过调用drop()初始化NPC_DROPS数组的元素将重新初始化。

嗯,NPC_DROPS是一个常量,所以它不能改变。每次访问时都使用以下方法生成:

public static int[][] generateNpcDrops(){
    return new int[][] {

    // Normal NPC's
    {1, 526, 1, ALWAYS}, 
    {2, 526, 1, ALWAYS}, 
    {3, 526, 1, ALWAYS}, 
    {1, 995, drop(1, 50), ALWAYS}, 
    {2, 995, drop(1, 50), ALWAYS},
    {3, 995, drop(1, 50), ALWAYS},

    // Moderate NPC's
    {9, 526, 1, ALWAYS}, 
    {9, 995, drop(250, 500), UNCOMMON},
    {9, 555, drop(2, 7), VERY_COMMON},
    {9, 995, drop(5, 50), VERY_COMMON},
    {9, 1050, 1, RARE}, 
    }
}

...

public void npcDeath() {
    int npc = 0;    
    if (npc == null)
        return;
    int[][] npcDrops = DropConfig.generateNpcDrops();
    for(npc = 0; npc < npcDrops.length; npc++) {
        if(npc == npcDrops[npc][0]) {
            if(Misc.random(npcDrops[npc][3]) == 0) { //Drops ALWAYS item
                Item(c, npcDrops[npc][1], npcDrops[npc][2]);
            }
        }
    }
}

答案 1 :(得分:0)

您希望将函数作为常量放置。你可以用Scala这样的语言自然地做到这一点,但是在Java中你必须更努力地工作。

在每种情况下,您都需要调用函数来获取实际值。

您可以使用枚举和匿名方法,但最简单的方法/黑客是对范围进行编码。

public static int rate(int min, int max) { // same for drop.
    int range = max - min;
    return (range << 16) | (min & 0xFFFF);
}

public static int eval(int minMax) {
    int min = (short) minMax;
    int range = (short) (minMax >> 16);
    if (range == 0)
       return min; // plain number.
    else
       return min + (int) (Math.random() * (range + 1));
}

您需要调用eval()将编码范围转换为随机数。

答案 2 :(得分:0)

使用相同的种子创建一个Random实例,您将获得相同的“随机”数字。你考虑过使用SecureRandom吗? SecureRandom和Random之间的区别在于SecureRandom在每次调用时都会产生非确定性输出。