我得到了一个实验室作业,我们被要求填充50号阵列。前25个元素有随机的不同元素,剩下的每个元素必须是26个。我们所要做的就是使用拉斯维加斯算法打印重复元素,显然是26。
我编写了这个程序,因为这是我第一次使用Java,我遇到了一个异常的数组索引超出范围。
我也确定该算法没有任何问题,请注意我首先创建了一个列表,然后将其转换为Integer类型的数组。
希望伸出援助之手。
代码如下: -
public class NewClass {
static Random randomGenerator = new Random();
public static void lasveg(Integer a[],int n)
{
int i,j;
boolean chk= true;
while(chk)
{
i=(randomGenerator.nextInt())%n+1;
j=(randomGenerator.nextInt())%n+1;
if((i!=j)&&(a[i].equals(a[j])))
System.out.println("The repeated element is : " + i);
}
}
public static void main(String[] args)
{
int i ;
Integer[] arr = new Integer[50] ; //used the Integer wrapper class instead of primitive int
ArrayList list = new ArrayList(50);
for (i=1; i<26; i++)
{
list.add(i) ;
}
Collections.shuffle(list);
for(i=26 ; i<51 ; i++)
{
list.add(26) ;
}
list.toArray(arr) ;
for(i=0 ; i<50 ; i++)
{
System.out.print(arr[i] + " ");
}
lasveg(arr,50);
}
}
答案 0 :(得分:2)
代码有几个问题:
randomGenerator.nextInt()可以返回负数而你 不能使用负数作为数组的索引。
如果您使用%n + 1,则可以获得大于49的索引 应该是长度为50的数组中的最高索引。
第三件事是你有一个无限循环,因为你永远不会 结束时间(真实)
如果您更改了所有内容,那么您的代码可能如下所示:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
public class NewClass {
static Random randomGenerator = new Random();
public static void lasveg(Integer a[], int n) {
int i, j;
boolean chk = true;
while (chk) {
i = Math.abs(randomGenerator.nextInt()) % n ;
j = Math.abs(randomGenerator.nextInt()) % n ;
if ((i != j) && (a[i].equals(a[j]))){
System.out.println("The repeated element is : " + i);
break;
}
}
}
public static void main(String[] args) {
int i;
Integer[] arr = new Integer[50]; // used the Integer wrapper class
// instead of primitive int
ArrayList list = new ArrayList(50);
for (i = 1; i < 26; i++) {
list.add(i);
}
Collections.shuffle(list);
for (i = 26; i < 51; i++) {
list.add(26);
}
list.toArray(arr);
for (i = 0; i < 50; i++) {
System.out.print(arr[i] + " ");
}
lasveg(arr, 50);
}
}
输出:
24 20 19 14 13 16 10 7 22 18 12 15 2 6 3 25 17 8 1 21 4 5 11 23 9 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 The repeated element is : 26
答案 1 :(得分:1)
如果你用n = 50调用这个函数而你的数组有50个元素
public static void lasveg(Integer a[],int n)
{
int i,j;
boolean chk= true;
while(chk)
{
i=(randomGenerator.nextInt())%n+1;
j=(randomGenerator.nextInt())%n+1;
if((i!=j)&&(a[i].equals(a[j])))
System.out.println("The repeated element is : " + i);
}
}
如果随机数为(50 * x)-1%50 + 1,则调用[50]会导致超出范围异常。 您不希望增加术语 rand%n ,然后您将获得0到49之间的范围。
答案 2 :(得分:1)
您的i
和j
变量在从0到n
的细分中分配了一个随机数,包括n
i=(randomGenerator.nextInt())%n+1;
j=(randomGenerator.nextInt())%n+1;
在Java中,n
元素数组的最后一个元素的索引是n-1
,所以有可能,这个语句
if((i!=j)&&(a[i].equals(a[j])))
System.out.println("The repeated element is : " + i);
将导致索引超出绑定异常。
答案 3 :(得分:1)
你遇到的问题是你必须注意数组从0号位置开始。
array[0];
因此,当您使用方法lasveg
时,您设置了数字50
,并且真正尝试访问您51
和{{1}所在的位置a[i]
这里:
a[j]
要解决您的问题,您必须这样做:
if((i!=j)&&(a[i].equals(a[j])))
避免lasveg(arr,49);
+ 1
的另一个解决方案。改变这个:
Random
到此:
i=(randomGenerator.nextInt())%n+1;
j=(randomGenerator.nextInt())%n+1;
我希望它会对你有所帮助!