3

我是一名学生,正在尝试编写一个测试概率的程序。它被称为 TestLuck,它应该生成用户确定数量的 IntArrayLogs(ADT),其中填充了随机值。该程序应该计算在与第一个值匹配之前生成了多少个值。

实际问题:“创建应用程序TestLuck;让用户输入随机整数范围的上限(书上说10,000,但您也应该使用365进行测试)以及运行测试的次数。计算并输出平均的。”

这是我想出的,但由于某种原因我没有得到正确的结果,我测试了我使用的方法,它们似乎工作正常,我认为这与我如何跟踪计数器有关.

for(int k=0; k<numTests; k++) {   
    for(int i=0; i<upperLimit; i++) {
        arrLog.insert(n);
        n = rand.nextInt(upperLimit);
        if(arrLog.contains(arrLog.getElement(0))) {
            totalCount += i;
            break;
        }
        if(i == upperLimit-1)
            totalCount +=i;
    }

    System.out.println("Total Count: " + totalCount);
    arrLog.clear();
}   
testAverage = totalCount/numTests;
System.out.println("Average tests before match: " + testAverage);

包含方法:

// Returns true if element is in this IntLog,
// otherwise returns false.
public boolean contains(int element) {                  
    int location = 0;
    int counter = 0;
    while (location <= lastIndex) {
        if (element == log[location]) {  // if they match
            counter++;
            location++;
            if(counter == 2)
                return true;
        } else
            location++;
    }
    return false;
}
4

2 回答 2

1

您不需要contains()方法,因为这只会花费更多时间来计算像比较这样简单的东西。

问题是在匹配第一个数字之前必须生成多少个数字,但是您需要考虑这是否包括第一个数字。例如。{1,2,3,4,1} count = 5,或 {1,2,3,4,1} count = 4。无论哪种方式,这都不会影响此答案的逻辑:

如果你重新安排你的方法,它会工作得更快。

for(int k=0; k<numTests; k++){   
    for(int i=0; i<upperLimit; i++){
        arrLog.insert(n);
        if(arrLog.getElement(0) == n && i != 0){// i != 0 to prevent it from counting a match on the first iteration
            totalCount += i;//totalCount += i+1 if you are counting the first number
            break;
        }
        n = rand.nextInt(upperLimit);
    }
    System.out.println("Total Count: " + totalCount);
    arrLog.clear();
}   
testAverage = totalCount/numTests;
System.out.println("Average tests before match: " + testAverage);

如果您需要使用contains()方法,请在评论中告诉我,我将编辑答案。

我还想建议不要使用任何存储数据结构,在这种情况下是 ADT 的 IntArrayLog (同样,我不知道您是否需要在课程中使用 ADT);以便您的程序运行得更快:

int firstNum;
for(int k=0; k<numTests; k++){
    firstNum = rand.nextInt(upperLimit);
    for(int i=1; i<upperLimit; i++){//notice this starts in 1
        n = rand.nextInt(upperLimit);
        if(firstNum == n){
            totalCount += i;//totalCount += i+1 if you are counting the first number
            break;
        }
    }
    System.out.println("Total Count: " + totalCount);
    arrLog.clear();
}   
testAverage = totalCount/numTests;
System.out.println("Average tests before match: " + testAverage);
于 2013-09-04T21:04:11.643 回答
0

我在你的代码中发现了一些奇怪的东西。

首先,您在给出值n之前插入。arrLogn

其次,您正在测试是否i == upperLimit-1for循环后将 1 添加到计数器。for如果循环在最后一步中断(在这种情况下,您已将 2 添加到计数器),您只会满足此条件。

第三,contains如果您找到element两次,则在该方法中返回 true。据我了解,第一次应该在位置 0(第一个元素),然后是测试本身,但是您将第一个元素作为参数传递。您可能应该从location1 开始(跳过第一个元素)并计算一次:

for (location=1; location<=lastIndex; location++) {
    if (element = log[location]) return true;
}
return false;

然而,它应该更容易narrLog.getElement(0)

PS我假设其他所有内容都已正确初始化。

于 2013-09-04T19:46:47.477 回答