【发布时间】:2015-05-04 19:41:27
【问题描述】:
所以我有一个问题,我已经绞尽脑汁了大约一个星期了。情况是:
考虑在杂货店排队结账。在任何给定的 第二,新客户加入该行的概率为0.02(没有 在任何给定的一秒内,不止一个客户加入该行)。这 结账员花费 20 秒到 75 秒之间的随机时间 秒服务每一位客户。写一个程序来模拟这个 大约一千万秒的场景并打印出平均值 顾客排队等候的秒数 店员开始为顾客服务。请注意,由于您不知道 在任何给定时间可能排队的最大客户数量, 您应该使用 ArrayList 而不是数组。
预期的平均等待时间应该在 500 到 600 秒之间。但是,我在接近这个范围的任何地方都没有得到答案。鉴于排队中出现新客户的概率仅为 2%,我预计排队人数永远不会超过 1 人,因此平均等待时间约为 45-50 秒。我问了一个朋友(他是数学专业的)他对这个问题的看法,他同意在 2% 的概率下,45 秒是一个合理的平均值。到目前为止,我的代码是:
package grocerystore;
import java.util.ArrayList;
import java.util.Random;
public class GroceryStore {
private static ArrayList<Integer> line = new ArrayList();
private static Random r = new Random();
public static void addCustomer() {
int timeToServe = r.nextInt(56) + 20;
line.add(timeToServe);
}
public static void removeCustomer() {
line.remove(0);
}
public static int sum(ArrayList<Integer> a) {
int sum = 0;
for (int i = 0; i < a.size(); i++) {
sum += a.get(i);
}
return sum;
}
public static void main(String[] args) {
int waitTime = 0;
int duration = 10000;
for (int i = 0; i < duration; i++) {
double newCust = r.nextDouble();
if (newCust < .02) {
addCustomer();
}
try {
for (int j = 0; j < line.get(0); j++) {
waitTime = waitTime + sum(line);
}
} catch (IndexOutOfBoundsException e) {}
if (line.isEmpty()) {}
else {
removeCustomer();
}
}
System.out.println(waitTime/duration);
}
}
对此的任何建议将不胜感激。
【问题讨论】:
-
你可以在
line.isEmpty()前面加上一个!来否定它,这样你就不会有空的if块 -
你真的不应该追
IndexOutOfBounds -
平均处理时间 (47.5 s) 比平均到达时间 (50 s) 略短。所以我预计通常会有一条等候线。您可以尝试改变问题的参数,看看会发生什么。如果处理时间或多或少,对等待时间有何影响?如果到达间隔时间(相当于到达概率)或多或少会有什么影响?
标签: java random simulation probability