2017-02-18 8 views
1

ルーレットボットシミュレータをテストしているときに奇妙な問題が発生しました。 プログラムは非常にシンプルで、ルーレットホイール付きの賭けサイトからのチャンスを利用しています。それは私がこのプログラムを作ったが最適な設定を見つけるためにあなたに自動的に賭けることができる自動化されたシステムを持っています。試行回数が約400を下回ると、パーセンテージを計算するときにエラーが発生します。%%を計算するときに生成されるinf%

#include "stdafx.h" 
#include <iostream> 
#include <conio.h> 
#include <Windows.h> 
#include <cstdlib> 
#include <ctime> 
using namespace std; 
int main() 
{ 
    cout << "how many trials would you like?" << endl; 
    HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE); 
    srand(time(0)); 
    double yAmount = 0; 
    double bAmount = 0; 
    double rAmount = 0; 
    double gAmount = 0; 
    int finaltrial = 0; 
    int yellow = 1; 
    int blue = yellow + 10; 
    int red = blue + 17; 
    int grey = red + 26; 
    int money = 5000; 
    int trialno = 0; 
    int trials; 
    cin >> trials; 
    int result; 
    int bet = 10; 
    int moneyhigh = 0; 
    bool win; 
    bool bankrupt = false; 
    while (trialno < trials || trials == 0 && bankrupt == true) 
    { 
     result = rand() % 54 + 1; 
     if (result == yellow) 
     { 
      SetConsoleTextAttribute(h, FOREGROUND_RED | FOREGROUND_GREEN); 
      cout << "Yellow"; 
      yAmount++; 
      win = false; 
     } 
     else if (result <= blue) 
     { 
      SetConsoleTextAttribute(h, FOREGROUND_BLUE); 
      cout << "Blue"; 
      win = false; 
      bAmount++; 
     } 
     else if (result <= red) 
     { 
      SetConsoleTextAttribute(h, FOREGROUND_RED); 
      cout << "Red"; 
      win = false; 
      rAmount++; 
     }  
     else if (result <= grey) 
     { 
      SetConsoleTextAttribute(h, FOREGROUND_GREEN); 
      cout << "Green"; 
      win = true; 
      gAmount++; 
     }  
     if (win == true) 
     { 
      money = money + bet; 
      bet = 10; 
     } 
     else 
     { 
      money = money - bet; 
      bet = bet * 2; 
     } 
     if (bet > money) 
     { 
      finaltrial = trialno; 
      trialno = trials - 1; 
      bankrupt = true; 
     } 
     if (money > moneyhigh) 
     { 
      moneyhigh = money; 
     } 
     cout << endl << " trial: " << trialno << " money: " << money <<    endl; 
     trialno++; 
    } 
    gAmount = gAmount/finaltrial ; 
    rAmount = rAmount/finaltrial ; 
    bAmount = bAmount/finaltrial ; 
    yAmount = yAmount/finaltrial ; 
    cout << endl << "Final: " << money << " Peak: " << moneyhigh << endl; 
    cout << "Green: " << gAmount << "% " << "Red: " << rAmount << "% " <<  "Blue: " << bAmount << "% " << "Yellow: " << yAmount << "% " << endl; 
    cin >> money; 
    return 0; 
} 
+0

[最小限で完全であり、検証可能な例](http://stackoverflow.com/help/mcve)を作成してください。 *ビルド*し、うまくいけば間違った順序で処理しないでください(計算で 'money 'を使った後に' money' *の入力を得るなど)。 –

+0

@Someprogrammerdudeシン・マネーは一時的だったので、デバッグ時にプログラムが自動的に閉じず、今度はプログラム全体が悪くなります。 – Ravaen

+0

デバッグ中にビジュアルスタジオが閉じないようにするには、次のように警告してください: 'while(trialno user4581301

答えて

1

あなたは0変数でfinaltrialを初期化ループ文は、ループfinaltrialの終わりに、決して真にはならない場合は0に等しくなることを意味し、唯一if (bet > money)句で編集されている前に、あなたは、CまたはC++でfinaltrialと結果変数を分割され、そしてgAmountをdoubleとして定義され、double/0戻るinf

0

もし0によって二重データ型を分割する場合は、それはINFを返します。あなたの変数ファイナンストライアルは、if(bet> money)返信の場合にのみ更新されます。この条件が満たされない場合、finaltrialは0のままで、infがその問題を引き起こします。

0

は、あなたは、あなたのプログラムの先頭で0にそれを初期化しており、特定の条件が満たされたとき、あなたはそれを更新しているfinaltrial

1に初期化したいことがあります。ツアー条件が満たされているかどうかにかかわらず、除算操作ではfinaltrialを使用しています。除算操作を行うときは、0で除算していないことを確認する必要があります。そうでないと、infが得られます。 finaltrial 1を初期化すると、あなたはinfを得ることの問題を解消するのに役立ちます(あなたが他の場所で0finaltrialの値に更新しない限り)ほとんど

0

+ INFを得るための唯一の方法は、正の分子とゼロによる浮動小数点除算であります。それを知ることは、この問題をウサギのように狩るのに役立ちます。 (ゼロで負の分子除算を行うと、-Infと0.0/0はNaNに評価され、数値ではないことに注意してください。)

finalTrialはゼロです。これは最小限のプログラム制御パス。

関連する問題