Short program hangs in C
Every time this code runs in UNIX, it hangs and displays a new line without a prompt. It compiles without error. Anyone know what's up here?
/*
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开发者_如何学Python*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);
}
I think the error is here:
while (p < MIN_PROFIT*100) {
p = random() % (MAX_PROFIT + 1); // fetch new random number that may fit parameters
}
If the loop body is entered p
will be set to a number between 0 and MAX_PROFIT
(= 43). It will never be greater than or equal to MIN_PROFIT*100
(= 3800), so it will go into an infinite loop.
As a side-note, you might want to consider using do { } while
loops here instead of using a while
loop and writing the loop body twice. Writing code twice is an excellent way to make errors, because when you change one of the implementations you always have to remember to change the other. If you forget to update both you will introduce a bug. And that seems to be what happened here.
Hard to tell from that wall of code, but it is either taking longer than you think it should or one of your many while statements is incorrect.
You could replace the while statements and speed the whole thing up by getting a random number between 0 and the difference between your various min and max parameters, then adding that to the min parameter, instead of what you are doing at the moment which is getting a random number up to the value of your max parameter, then trying again if is below your min. In the case of your widgets, for example, you are throwing away 2/3 of your results.
精彩评论