2012-11-28 53 views
0

似乎无法使其发挥作用。这个想法是计算每次计数后头和尾的百分比,每次迭代后累计。除了我一直得到nan%为我的计算。有人看到我做错了什么?C++:在每次迭代过程中计算概率百分比

void flipCoin(time_t seconds, int flipCount){ 
    vector<int> flips; 
    float headCount = 0; 
    float tailCount = 0; 
    double headProbability = double((headCount/(headCount + tailCount))*100); 
    double tailProbability = double((tailCount/(headCount + tailCount))*100); 

    for (int i=0; i < flipCount; i++) { 
     int flip = rand() % (HEADS - TAILS + 1) + TAILS; 
     flips.push_back(flip); 
     if (flips[i] == 1) { 
      tailCount++; 
      cout << "Tail Percent: " << tailProbability << "%" << endl; 
     }else{ 
      headCount++; 
      cout << "Head Percent: " << headProbability << "%" << endl; 
     } 
    } 
} 
+0

将'headCount'强制转换为'double'。你会得到什么输出? –

+0

“headCount + tailCount”是否为零?如果是这样的话:BZZZZZ!那就是你得到“不是数字”的地方!解?确保你的代码永远不会试图用零除数;换句话说,增加headCount和/或tailCount * BEFORE *你计算“概率”。 – paulsm4

回答

2

你想这样做

void flipCoin(time_t seconds, int flipCount){ 
    vector<int> flips; 
    float headCount = 0; 
    float tailCount = 0; 
    double headProbability = 0; 
    double tailProbability = 0; 

    for (int i=0; i < flipCount; i++) { 
     int flip = rand() % (HEADS - TAILS + 1) + TAILS; 
     flips.push_back(flip); 
     if (flips[i] == 1) { 
      tailCount++; 
      tailProbability = double((tailCount/(headCount + tailCount))*100); 
      cout << "Tail Percent: " << tailProbability << "%" << endl; 
     }else{ 
      headCount++; 
      headProbability = double((headCount/(headCount + tailCount))*100); 
      cout << "Head Percent: " << headProbability << "%" << endl; 
     } 
    } 
} 

另外,如果你想要做的是打印的百分比,你不需要tailProbability或headProbablity。您可以直接打印计算结果。

编辑:你也可以用i + 1替换headCount + tailCount。但是如果您稍后改变功能,可能会导致问题。

1

你的问题就在于,你永远只能计算headProbabilitytailProbability一次 - 当你计算它们,它会评估为0/0

float headCount = 0; 
float tailCount = 0; 
// Both are 0, end up as 0/0 
double headProbability = double((headCount/(headCount + tailCount))*100); 
double tailProbability = double((tailCount/(headCount + tailCount))*100); 

//Never recalculated in the loop 

要解决这个问题,只需将它们初始化为0,然后在循环中重新计算它们。您也似乎并不需要一个vector在这里,因为你只需要保持计数的轨迹,每一个翻转的不结果:

double headProbability = 0; 
double tailProbability = 0; 

for(int i = 0; i < flipCount; ++i) { 
    int flip = rand() % (HEAS - TAIL + 1) + TAILS; //This could be simplified 
    if(flip == 1) { 
     ++tailCount; 
     //Recalculate tailProbability 
    } else { 
     //Etc... 
    } 
} 
0

nan不是指一个数字。你得到它,因为你除以0.

您的代码计算概率只是一次,在任何翻转硬币之前。 您需要在循环中为每次迭代后的重新计算概率添加计算。

void flipCoin(time_t seconds, int flipCount){ 
    vector<int> flips; 
    float headCount = 0; 
    float tailCount = 0; 
    double headProbability; 
    double tailProbability; 

    for (int i=0; i < flipCount; i++) { 
     int flip = rand() % (HEADS - TAILS + 1) + TAILS; 
     flips.push_back(flip); 

     headProbability = double((headCount/(headCount + tailCount))*100); 
     tailProbability = double((tailCount/(headCount + tailCount))*100); 

     if (flips[i] == 1) { 
      tailCount++; 
      cout << "Tail Percent: " << tailProbability << "%" << endl; 
     }else{ 
      headCount++; 
      cout << "Head Percent: " << headProbability << "%" << endl; 
     } 
    } 
}