1

我是 2D 数组的新手,虽然我认为我理解它,但我不确定为什么我会得到这个 Index Out of Bounds Exception。我尝试将地图大小设置为 70x100,但仍然收到相同的错误。似乎认为我正在搜索索引-1156638823,我不明白为什么。任何帮助,将不胜感激!

public int rand(int i) {
    return new Random(i).nextInt();
}

public void createMap() {
    map = new Grid[7][10];
    for (int i = 0; i < 7; i++) {
        for (int j = 0; j < 10; j++) {
            map[i][j] = new Grid(false, false, false, false, false, false,
                    false, false, false, false, false, false, false, false,
                    false, false);
        }
    }
    map[rand(7)][0] = new Grid(true, false, true, true, false, true, false,
            false, false, false, false, false, false, false, false, true);
    map[rand(7)][rand(10)] = new Grid(true, false, false, false, false,
            false, true, false, false, false, false, false, false, false,
            false, false);
}

LOGCAT

05-07 19:29:00.183: E/AndroidRuntime(1532): FATAL EXCEPTION: main
05-07 19:29:00.183: E/AndroidRuntime(1532): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.evorlor.dungeonmaster/com.evorlor.dungeonmaster.DM}: java.lang.ArrayIndexOutOfBoundsException: length=7; index=-1156638823
05-07 19:29:00.183: E/AndroidRuntime(1532):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at android.app.ActivityThread.access$600(ActivityThread.java:123)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at android.os.Looper.loop(Looper.java:137)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at android.app.ActivityThread.main(ActivityThread.java:4424)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at java.lang.reflect.Method.invokeNative(Native Method)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at java.lang.reflect.Method.invoke(Method.java:511)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at dalvik.system.NativeStart.main(Native Method)
05-07 19:29:00.183: E/AndroidRuntime(1532): Caused by: java.lang.ArrayIndexOutOfBoundsException: length=7; index=-1156638823
05-07 19:29:00.183: E/AndroidRuntime(1532):     at com.evorlor.dungeonmaster.DM.createMap(DM.java:101)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at com.evorlor.dungeonmaster.DM.initialize(DM.java:19)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at java.lang.reflect.Method.invokeNative(Native Method)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at java.lang.reflect.Method.invoke(Method.java:511)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at sofia.internal.events.EventDispatcher$MethodTransformer.invoke(EventDispatcher.java:474)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at sofia.internal.events.EventDispatcher.invokeTransformer(EventDispatcher.java:136)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at sofia.internal.events.EventDispatcher.dispatch(EventDispatcher.java:109)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at sofia.app.internal.ScreenMixin.invokeInitialize(ScreenMixin.java:561)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at sofia.app.Screen.onCreate(Screen.java:186)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at android.app.Activity.performCreate(Activity.java:4465)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
05-07 19:29:00.183: E/AndroidRuntime(1532):     ... 11 more
4

4 回答 4

4

你在滥用Random. 您已调用将Random初始种子设置为特定值的构造函数:i。但它并不限制返回的随机值。

nextInt()方法返回一个随机的、不受限制的int.

您需要以下代码:

public int rand(int i) {
    return new Random().nextInt(i);
}

nextInt(int)方法将返回范围内的随机整数限制0i - 1. 此外,无参数Random构造函数每次使用系统时间生成不同的随机种子(因此也产生不同的随机数)。

Java 中使用的随机数Random是伪随机的——它们是确定性的,但需要种子才能开始。使用相同的种子将使您返回相同的随机数。这就是为什么每次使用不同的种子很重要,而无参数Random构造函数会为您处理。

此外,您无需在Random每次rand调用对象时都创建另一个对象。您可以在您的类中将其创建为实例变量,然后在您的rand方法中引用它。

于 2013-05-07T19:38:33.810 回答
4

new Random(i).nextInt()不做你认为它做的事。

你应该使用:

new Random(seed).nextInt(i)

您的版本只是初始化种子但nextInt()在整个范围内返回一个整数,如果您想要一个较小的范围,您需要指定它,通过指定nextInt(i)您将获得一个值[0,1)

于 2013-05-07T19:38:54.800 回答
0

您使用的Random构造函数错误。其中的参数是种子。不是它将生成的最大数量。

例如,您可以在此处阅读有关什么是种子的信息:http ://en.wikipedia.org/wiki/Random_seed

如果您需要它生成从 0 到 X 的数字,则需要将 X 提供给该nextInt方法。

new Random().nextInt(X);
于 2013-05-07T19:38:08.430 回答
0

您使用了错误的方法:Random#nextInt(). 你以为你使用Random#nextInt(bound)了,它产生范围内的随机整数0(包括) - bound(不包括)。构造函数中的整数Random只是一个随机种子。

于 2013-05-07T19:41:13.427 回答