- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
基本上,问题是为在银行排队等候的人们创建一个模拟。需要一些特定的标准,例如平均等待时间、平均分钟数、平均最长等待时间...等。它还要求运行我的程序 3 次,每次 1000 次(使用 for 循环)。问题是,每次我运行代码时,答案都会由于某种原因而累加,但我似乎不知道为什么。例如,在最后一次运行中,模拟运行的次数应该是 1000 次,但它却将之前的所有运行加在一起并给出了 3000 次。
此外,while 循环之外的所有变量(averageWaitingTime、averageSimulationTime...等)都给了我错误的答案。这是因为,例如,对于平均等待时间,它不断添加相同的等待时间值。我不明白为什么。
public class QueueSimulation {
public static void main(String[] args) {
Queue<Customer> q = new LinkedList<Customer>();
int numServed = 0;
int averageNumServed = 0;
int waitingTime = 0;
int maxWaitingTime = 0;
int averageLongestWaitingTime = 0;
int totalWaitingTime = 0;
double averageWaitingTime = 0;
int maxQueueSize = 0;
int timeDone = 0;
int totalSimulationTime = 0;
int averageSimulationTime = 0;
int numSimulationRan = 0;
Random randomGenerator = new Random();
int time = 0;
int processingTime = 0;
int totalProcessingTime = 0;
for (int i = 0; i < 1000; i++) {
double arrivalRate = 0.2;
int maxProcessingTime = 5;
while (time < 8 * 60) {
if (Math.random() < 0.2) {
System.out.println("A new customer arrives at time " + time);
processingTime = randomGenerator.nextInt(maxProcessingTime);
totalProcessingTime += processingTime;
Customer c = new Customer(time, processingTime);
q.add(c);
if (q.size() > maxQueueSize)
maxQueueSize = q.size();
}
if (waitingTime > maxWaitingTime)
maxWaitingTime = waitingTime;
averageLongestWaitingTime += maxWaitingTime;
// serve the next customer
if (time > timeDone) // service is available
if (!q.isEmpty()) {
Customer c = q.remove();
timeDone = time + c.getProcessingTime();
// calculate the waiting time of this customer
waitingTime = time - c.getArrivalTime();
// update total waiting time of all customers
totalWaitingTime += waitingTime;
// service this customer
numServed++;
}
time++;
if (time > 8 * 60)
while (!q.isEmpty()) {
Customer c = q.remove();
timeDone = time + c.getProcessingTime();
// calculate the waiting time of this customer
waitingTime = time - c.getArrivalTime();
// update total waiting time of all customers
totalWaitingTime += waitingTime;
// service this customer
numServed++;
}
}
averageWaitingTime += (totalWaitingTime / numServed);
totalSimulationTime = timeDone;
averageSimulationTime += totalSimulationTime;
averageNumServed += numServed;
numSimulationRan += 1;
}
System.out.println();
System.out.println("Average waiting time per customer: " + (double) averageWaitingTime / 1000);
System.out.println("Average longest waiting time: " + (double) averageLongestWaitingTime / 1000);
System.out.println("Average number of minutes: " + (double) averageSimulationTime / 1000);
System.out.println("Longest waiting time: " + maxWaitingTime);
System.out.println("Average number of customers " + (double) averageNumServed / 1000);
System.out.println("Number of times the simulation ran: " + numSimulationRan);
for (int j = 0; j < 1000; j++) {
double arrivalRate = 0.5;
int maxProcessingTime = 3;
while (time < 8 * 60) {
if (Math.random() < 0.5) {
System.out.println("A new customer arrives at time " + time);
processingTime = randomGenerator.nextInt(maxProcessingTime);
totalProcessingTime += processingTime;
Customer c = new Customer(time, processingTime);
q.add(c);
if (q.size() > maxQueueSize)
maxQueueSize = q.size();
}
if (waitingTime > maxWaitingTime)
maxWaitingTime = waitingTime;
averageLongestWaitingTime += maxWaitingTime;
// serve the next customer
if (time > timeDone) // service is available
if (!q.isEmpty()) {
Customer c = q.remove();
timeDone = time + c.getProcessingTime();
// calculate the waiting time of this customer
waitingTime = time - c.getArrivalTime();
// update total waiting time of all customers
totalWaitingTime += waitingTime;
// service this customer
numServed++;
}
time++;
if (time > 8 * 60)
while (!q.isEmpty()) {
Customer c = q.remove();
timeDone = time + c.getProcessingTime();
// calculate the waiting time of this customer
waitingTime = time - c.getArrivalTime();
// update total waiting time of all customers
totalWaitingTime += waitingTime;
// service this customer
numServed++;
}
}
averageWaitingTime += (totalWaitingTime / numServed);
totalSimulationTime = timeDone;
averageSimulationTime += totalSimulationTime;
averageNumServed += numServed;
numSimulationRan += 1;
}
System.out.println();
System.out.println("Average waiting time per customer: " + (double) averageWaitingTime / 1000);
System.out.println("Average longest waiting time: " + (double) averageLongestWaitingTime / 1000);
System.out.println("Average number of minutes: " + (double) averageSimulationTime / 1000);
System.out.println("Longest waiting time: " + maxWaitingTime);
System.out.println("Average number of customers " + (double) averageNumServed / 1000);
System.out.println("Number of times the simulation ran: " + numSimulationRan);
for (int k = 0; k < 1000; k++) {
double arrivalRate = 0.68;
int maxProcessingTime = 4;
while (time < 8 * 60) {
if (Math.random() < 0.68) {
System.out.println("A new customer arrives at time " + time);
processingTime = randomGenerator.nextInt(maxProcessingTime);
totalProcessingTime += processingTime;
Customer c = new Customer(time, processingTime);
q.add(c);
if (q.size() > maxQueueSize)
maxQueueSize = q.size();
}
if (waitingTime > maxWaitingTime)
maxWaitingTime = waitingTime;
averageLongestWaitingTime += maxWaitingTime;
// serve the next customer
if (time > timeDone) // service is available
if (!q.isEmpty()) {
Customer c = q.remove();
timeDone = time + c.getProcessingTime();
// calculate the waiting time of this customer
waitingTime = time - c.getArrivalTime();
// update total waiting time of all customers
totalWaitingTime += waitingTime;
// service this customer
numServed++;
}
time++;
if (time > 8 * 60)
while (!q.isEmpty()) {
Customer c = q.remove();
timeDone = time + c.getProcessingTime();
// calculate the waiting time of this customer
waitingTime = time - c.getArrivalTime();
// update total waiting time of all customers
totalWaitingTime += waitingTime;
// service this customer
numServed++;
}
}
averageWaitingTime += (totalWaitingTime / numServed);
totalSimulationTime = timeDone;
averageSimulationTime += totalSimulationTime;
averageNumServed += numServed;
numSimulationRan += 1;
}
System.out.println();
System.out.println("Average waiting time per customer: " + (double) averageWaitingTime / 1000);
System.out.println("Average longest waiting time: " + (double) averageLongestWaitingTime / 1000);
System.out.println("Average number of minutes: " + (double) averageSimulationTime / 1000);
System.out.println("Longest waiting time: " + maxWaitingTime);
System.out.println("Average number of customers " + (double) averageNumServed / 1000);
System.out.println("Number of times the simulation ran: " + numSimulationRan);
}
}
输出:
A new customer arrives at time 5
A new customer arrives at time 10
A new customer arrives at time 11
A new customer arrives at time 12
A new customer arrives at time 25
A new customer arrives at time 28
A new customer arrives at time 31
A new customer arrives at time 45
A new customer arrives at time 48
A new customer arrives at time 51
A new customer arrives at time 59
A new customer arrives at time 64
A new customer arrives at time 68
A new customer arrives at time 86
A new customer arrives at time 100
A new customer arrives at time 106
A new customer arrives at time 108
A new customer arrives at time 113
A new customer arrives at time 115
A new customer arrives at time 120
A new customer arrives at time 124
A new customer arrives at time 125
A new customer arrives at time 126
A new customer arrives at time 132
A new customer arrives at time 137
A new customer arrives at time 153
A new customer arrives at time 156
A new customer arrives at time 164
A new customer arrives at time 201
A new customer arrives at time 206
A new customer arrives at time 208
A new customer arrives at time 219
A new customer arrives at time 226
A new customer arrives at time 233
A new customer arrives at time 234
A new customer arrives at time 237
A new customer arrives at time 242
A new customer arrives at time 246
A new customer arrives at time 247
A new customer arrives at time 251
A new customer arrives at time 262
A new customer arrives at time 271
A new customer arrives at time 276
A new customer arrives at time 277
A new customer arrives at time 282
A new customer arrives at time 285
A new customer arrives at time 287
A new customer arrives at time 292
A new customer arrives at time 296
A new customer arrives at time 298
A new customer arrives at time 318
A new customer arrives at time 319
A new customer arrives at time 327
A new customer arrives at time 336
A new customer arrives at time 337
A new customer arrives at time 338
A new customer arrives at time 346
A new customer arrives at time 355
A new customer arrives at time 356
A new customer arrives at time 358
A new customer arrives at time 362
A new customer arrives at time 363
A new customer arrives at time 366
A new customer arrives at time 374
A new customer arrives at time 379
A new customer arrives at time 380
A new customer arrives at time 384
A new customer arrives at time 389
A new customer arrives at time 400
A new customer arrives at time 407
A new customer arrives at time 416
A new customer arrives at time 418
A new customer arrives at time 424
A new customer arrives at time 427
A new customer arrives at time 433
A new customer arrives at time 436
A new customer arrives at time 437
A new customer arrives at time 438
A new customer arrives at time 446
A new customer arrives at time 454
A new customer arrives at time 466
A new customer arrives at time 469
A new customer arrives at time 471
Average waiting time per customer: 1.0
Average longest waiting time: 2.714
Average number of minutes: 475.0
Longest waiting time: 8
Average number of customers 83.0
Number of times the simulation ran: 1000
Average waiting time per customer: 2.0
Average longest waiting time: 2.714
Average number of minutes: 950.0
Longest waiting time: 8
Average number of customers 166.0
Number of times the simulation ran: 2000
Average waiting time per customer: 3.0
Average longest waiting time: 2.714
Average number of minutes: 1425.0
Longest waiting time: 8
Average number of customers 249.0
Number of times the simulation ran: 3000
最佳答案
有一个原则叫做 Don't Repeat Yourself or DRY 。在这个术语被创造之前,我们曾经开玩笑说,懒惰是程序员的一个好品质:如果你必须做某件事两次,那么你就太频繁地做了一次。
也许你可以考虑声明一些 methods因为你的程序似乎有相同的代码三次。
讽刺的是,有一件事你只做一次:初始化统计变量:
int numServed = 0;
...
如果您复制此部分并删除类型(因此它显示为 numServed = 0;
等),然后再次复制该部分,则会重置这些变量。然而,复制粘贴代码是一种不好的做法:现在您需要维护的代码数量是原来的 3 倍。
要解决此问题,您可以像这样构建程序:
class QueueSimulation
{
public static void main(String[] args) {
for ( int test = 0; test < 3; test ++ ) {
int numServed = 0;
..
for ( int i = 0; i < 1000; i++) {
...
}
System.out.println();
....
}
}
}
没有重复的代码,并且它本地化了变量,因此每次模拟都会重置它们 - 这解决了您的问题。
这只是朝着正确方向迈出的一步。又一步是factor out方法在 abstraction levels ,如Top-Down and Bottom-Up design .
TLDR:一个好的经验法则是让任何方法适合一页文本。
就您的情况而言:您正在运行相同的模拟 3 次。该模拟的细节是什么对于运行模拟 3 次的方法来说并不重要。
这是另一种可能的概要,我们将变量转换为 QueueSimulation
类的字段。为了初始化它们,我们只需实例化一个新的 QueueSimulation。这里是:
class QueueSimulation
{
public static void main(String[] args) {
for ( int test = 0; test < 3; test ++ ) {
QueueSimulation sim = new QueueSimulation();
sim.simulate();
sim.report();
}
}
Queue<Customer> q = new LinkedList<Customer>();
int numServed = 0;
...
int totalProcessingTime = 0;
public void simulate() {
for ( int i = 0; i < 1000 ) {
....
}
}
public void report() {
System.out.println( ....
...
}
}
关于java - 为什么每次我运行程序时它都会添加到最后一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36460621/
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!