每次此代码在UNIX中运行时,它都会挂起并显示一个没有提示的新行。它编译没有错误。有谁知道这里有什么?
/*
This program uses a Monte Carlo simulation to maximize widget profits.
*/
#include <stdio.h>
#include <stdlib.h>
// constant values used in the simulation
#define MIN_WIDGETS 1000 // minimum widgets per month
#define MAX_WIDGETS 1500 // maximum widgets per month
#define MIN_COST 0.25 // minimum cost per widget
#define MAX_COST 0.82 // maximum cost per widget
#define MIN_CONVERSION 0.01 // minimum converstion rate
#define MAX_CONVERSION 0.05 // maximum converstion rate
#define MIN_PROFIT 38 // minimum profit per sale
#define MAX_PROFIT 43 // maximum profit per sale
#define FIXED_OVERHEAD 400 // fixed overhead cost
#define NUM_SIMULATIONS 100 // number of simulations performed
void main()
{
// to keep track of inputs in highest-profit simulation
int bestW = 0; // widgets per month
float bestC = 0; // cost per widget
float bestR = 0; // rate of converstion
float bestP = 0; // profit per sale
float bestProfit = 0; // highest profit
srand(time(0)); // initialize the random number generator
float h = FIXED_OVERHEAD;
int i; // loop index
for(i = 0; i < NUM_SIMULATIONS; i++)
{
// initialize inputs for this individual simulation
int w = 0; // quantity of widgets bought
float c = 0; // cost of a widget
float r = 0; // conversion rate
float p = 0; // profit per sale
float profit = 0; // profit
// simulate quantity of widgets bought per month, between MIN_WIDGETS and MAX_WIDGETS
w = random() % (MAX_WIDGETS + 1); // to set the maximum value of w at MAX_WIDGETS
while (w < MIN_WIDGETS) {
w = random() % (MAX_WIDGETS + 1); // fetch new random number that may fit parameters
}
// simulate cost per widget, between MIN_COST and MAX_COST
c = random() % 100; // to convert random number into an integer between 0 and 99
while (c < (MIN_COST*100) || c > (MAX_COST*100)) {
c = random() % 100; // fetch new random number that may fit parameters
}
c = c / 100.0; // convert cost back from cents into dollars
// simulate conversion rate, between MIN_CONVERSION and MAX_CONVERSION
r = random() % 100; // to convert random number into an integer between 0 and 99
while (r < (MIN_CONVERSION*100) || r > (MAX_CONVERSION*100)) {
r = random() % 100; // fetch new random number that may fit parameters
}
r = r / 10.0; // convert back into fraction
// simulate profit per sale, between MIN_PROFIT and MAX_PROFIT
p = random() % ((MAX_PROFIT + 1)*100); // to convert random number into an integer between 0 and 4300
while (p < MIN_PROFIT*100) {
p = random() % (MAX_PROFIT + 1); // fetch new random number that may fit parameters
}
p = p / 100.0; // convert back into floating point with two decimal places after period
profit = (w * r * p) - (h + c * w);
printf("Current profit is $%.2f, with %d widgets at a %.2f cost per widget with a %.1f conversion rate and %.2f profit/sale.\n",
profit, w, c, r, p);
if (profit > bestProfit) {
bestW = w;
bestC = c;
bestR = r;
bestP = p;
bestProfit = profit;
}
}
printf("Maximum profit is $%.2f, with %d widgets at a %.2f cost per widget with a %.1f conversion rate and %.2f profit/sale.\n",
bestProfit, bestW, bestC, bestR, bestP);
}
答案 0 :(得分:5)
我认为错误就在这里:
while (p < MIN_PROFIT*100) {
p = random() % (MAX_PROFIT + 1); // fetch new random number that may fit parameters
}
如果输入循环体,p
将设置为0到MAX_PROFIT
(= 43)之间的数字。它永远不会大于或等于MIN_PROFIT*100
(= 3800),因此它将进入无限循环。
作为旁注,您可能需要考虑在此处使用do { } while
循环,而不是使用while
循环并将循环体写入两次。编写代码两次是一种很好的错误方法,因为当你改变其中一个实现时,你总是要记住改变另一个。如果您忘记更新两者,则会引入错误。这似乎就是这里发生的事情。
答案 1 :(得分:1)
很难从代码墙中分辨出来,但它要么花费的时间比你想象的要长,要么你的许多时间之一是不正确的。
您可以替换while语句并通过获取介于0和各种最小和最大参数之间的差异的随机数,然后将其添加到min参数,而不是当前正在执行的操作来加快整个过程的速度。获取最大参数值的随机数,然后再次尝试,如果低于你的最小值。例如,对于小部件,您将丢弃2/3的结果。