短程序挂起在C中

短程序挂起在C中,c,freeze,C,Freeze,每次此代码在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 /

每次此代码在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);

}
/*
该程序使用蒙特卡罗模拟来最大化小部件利润。
*/
#包括
#包括
//模拟中使用的常量值
#定义最小窗口小部件1000//每月最小窗口小部件
#定义MAX_WIDGETS 1500//maximum WIDGETS每月
#定义最小成本0.25//每个小部件的最小成本
#定义最大成本0.82//每个小部件的最大成本
#定义最小转换率0.01//最小对话率
#定义最大转换率0.05//最大对话率
#定义最低利润38//每次销售的最低利润
#定义最大利润43//每次销售的最大利润
#定义固定间接费用400//固定间接费用成本
#定义NUM_仿真100//执行的仿真数量
void main()
{
//跟踪最高利润模拟中的投入
int bestW=0;//每月小部件数
float bestC=0;//每个小部件的成本
float bestR=0;//会话速率
float bestP=0;//每次销售的利润
浮动最佳利润=0;//最高利润
srand(time(0));//初始化随机数生成器
浮球h=固定顶置;
int i;//循环索引
对于(i=0;i(最高成本*100)){
c=random()%100;//获取可能适合参数的新随机数
}
c=c/100.0;//将成本从美分转换回美元
//模拟最小转换和最大转换之间的转换率
r=random()%100;//将随机数转换为0到99之间的整数
而(r<(最小换算*100)| r>(最大换算*100)){
r=random()%100;//获取可能适合参数的新随机数
}
r=r/10.0;//转换回分数
//模拟每笔销售的利润,介于最低利润和最高利润之间
p=random()%((最大利润+1)*100);//将随机数转换为0到4300之间的整数
而(p最佳利润){
bestW=w;
bestC=c;
最佳=r;
bestP=p;
最佳利润=利润;
}
}
printf(“最大利润为$%.2f,每个小部件的成本为%.2f,转换率为%.1f,利润/销售额为%.2f,有%d个小部件。\n”,
最佳利润、最佳W、最佳C、最佳R、最佳P);
}

我认为错误在这里:

while (p < MIN_PROFIT*100) {
    p = random() % (MAX_PROFIT + 1); // fetch new random number that may fit parameters
}
while(p
如果输入循环体,
p
将设置为介于0和
MAX_PROFIT
(=43)之间的数字。它永远不会大于或等于
最小利润*100
(=3800),因此它将进入一个无限循环


作为一个旁注,您可能要考虑使用<代码> do{},而在此循环,而不是使用<代码>,而Roop和编写循环体两次。编写两次代码是犯错误的好方法,因为当您更改其中一个实现时,您必须始终记住更改另一个实现。如果您忘记更新这两个,您将引入一个bug。这似乎就是这里发生的事情。

我认为错误就在这里:

while (p < MIN_PROFIT*100) {
    p = random() % (MAX_PROFIT + 1); // fetch new random number that may fit parameters
}
while(p
如果输入循环体,
p
将设置为介于0和
MAX_PROFIT
(=43)之间的数字。它永远不会大于或等于
最小利润*100
(=3800),因此它将进入一个无限循环


作为一个旁注,您可能要考虑使用<代码> do{},而在此循环,而不是使用<代码>,而Roop和编写循环体两次。编写两次代码是犯错误的好方法,因为当您更改其中一个实现时,您必须始终记住更改另一个实现。如果您忘记更新这两个,您将引入一个bug。这似乎就是这里发生的事情。

很难从这堵代码墙中分辨出来,但它要么花费的时间比你想象的要长,要么你的许多while语句中的一个是不正确的


您可以替换while语句,并通过获取0之间的随机数以及各种min和max参数之间的差值,然后将其添加到min参数,而不是当前正在执行的操作,即获取一个最大参数值的随机数,如果低于最小值,请重试。例如,在小部件的情况下,您将丢弃2/3的结果

很难从那堵代码墙中分辨出来,但它要么比你想象的要长,要么是你的许多代码中的一个