Simulation problem

Pages: 12
ah and I signed up for that site but I don't know how to put the code on it =p
@giblit

Just wanted to point out that this code is pretty meaningless for a double type:

std::cout << std::setprecision( 100 ) << chance << std::endl;

Doubles only have 16sf of precision, so displaying any more than that doesn't mean anything.

Maybe you were wanting to show very small numbers? you can use std::cout's scientific mode for that.

Edit:

You also have magic number in your code. If there are 100 shooters, then declare a const variable, and use that throughout your code. That way if you want to change it you can do it once at the declaration. Same story for any other const thing like number of simulations.

These are just minor points - I mention them to help you out a little.
Last edited on
Yeah thanks for tip I used a constant for the number of simulations I just didn't put that in and I guess from now on I'll use more constant values to keep my code more neat. Also I think some compilers do it automatically unless I used scientific a while back on Qt and did not notice because I was couting pi or e a while back and and I set the precision very high and it showed a bunch of numbers. Also yeah they are 16 for precision and I believe floats are 8 and long doubles are like 20ish but I figured it would still show other numbers after that =p ( I could of swore on Qt that I saw like 4.0 with 15 0s then after that it was like random numbers I could be wrong though since I have started using code::blocks now )
@giblit

I was couting pi or e a while back and and I set the precision very high and it showed a bunch of numbers.


Yes, but they are meaningless.

If you really want a lot of precision - say calc pi to 100 dp, then use boost multi precision or gmp or something similar which is specifically designed for that sort of thing. You cannot use long doubles for this.

All of this is independent of which compiler you are using. Anything after 15 or 16 digits for a double will be garbage.

Long double only give about 18sf. Have a look in the reference for numeric_limits functions that show what all the limits are.

oh alright cool thanks for info.
After taking into consideration what you two told me I rewrote my program but the results are slightly different than the other revised program that took me 100 Minutes to run. The new program only takes 12 seconds to run it 1Million times so it is approximately 500X faster. Here is the code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#include <fstream>

struct Gunman
{
    bool alive;
    unsigned short accuracy;
    unsigned long kills , deaths , wins;
    Gunman( void )
    {
        alive = true;
        accuracy = 0;
        kills = 0;
        deaths = 0;
        wins = 0;
    }
};
void battle( Gunman *giblit , const unsigned short GUNMEN , const unsigned short FIRSTGUNMAN , const unsigned short FIRSTTARGET )
{
    unsigned short survivors = GUNMEN , currentGunman = FIRSTGUNMAN , target = FIRSTTARGET , firstAlive = FIRSTGUNMAN , draw = FIRSTGUNMAN;

    while( survivors > 1 )
    {
        while( !giblit[ currentGunman ].alive )
        {
            currentGunman++;
            if( currentGunman > target )
            {
                currentGunman = firstAlive;
            }
        }

        draw = rand() % GUNMEN + 1;

        if( draw > currentGunman + 1 )
        {
            currentGunman++;
        } else {
            if( currentGunman == target )
            {
                giblit[ firstAlive ].alive = false;
                giblit[ firstAlive ].deaths++;
                giblit[ currentGunman ].kills++;
                firstAlive++;
                survivors--;
            } else {
                giblit[ target ].alive = false;
                giblit[ target ].deaths++;
                giblit[ currentGunman ].kills++;
                target--;
                survivors--;
            }
            currentGunman++;
        }
    }
    giblit[ firstAlive ].wins++;
}

int main( int argc , char** argv )
{
    std::ofstream output( "results.txt" );
    srand( ( unsigned ) time( NULL ) );

    const unsigned short GUNMEN = 100 , FIRSTGUNMAN = 0 , FIRSTTARGET = 99;
    const unsigned long RUNS = 1e6;
    Gunman *giblit = NULL;
    giblit = new Gunman[ GUNMEN ];

    for( unsigned short i = 0; i < GUNMEN; i++ )
    {
        giblit[i].accuracy = i + 1; //Giving the gunmen their accuracy.
    }

    for( unsigned long i = 0; i < RUNS; i++ )
    {
        if( i > 0 )
        {
            for( unsigned short i = 0; i < GUNMEN; i++ )
            {
                giblit[ i ].alive = true; //making all the men alive
            }
        }

        battle( giblit , GUNMEN , FIRSTGUNMAN , FIRSTTARGET );
    }
    for( unsigned short i = 0; i < GUNMEN; i++ )
    {
        output << "Gunman " << i + 1 << " has " << giblit[ i ].kills << " kill(s), " << giblit[ i ].deaths << " death(s), and " << giblit[ i ].wins << " wins."
        << "Their K/D ratio is " << std::setprecision( 5 ) << ( double ) giblit[ i ].kills / giblit[ i ].deaths << "% and W/L ratio is " <<
        std::setprecision( 5 ) << ( double ) giblit[ i ].wins / RUNS  * 100 << "%." << std::endl;
    }

    delete giblit;
    return( 0 );
}

The output is extremely long( about 10k chars ) so I'll post some of it here and the rest on another post
Gunman 1 has 32866 kill(s), 999742 death(s), and 258 wins.Their K/D ratio is 0.032874% and W/L ratio is 0.0258%.
Gunman 2 has 175311 kill(s), 995331 death(s), and 4669 wins.Their K/D ratio is 0.17613% and W/L ratio is 0.4669%.
Gunman 3 has 491779 kill(s), 973693 death(s), and 26307 wins.Their K/D ratio is 0.50507% and W/L ratio is 2.6307%.
Gunman 4 has 998491 kill(s), 919284 death(s), and 80716 wins.Their K/D ratio is 1.0862% and W/L ratio is 8.0716%.
Gunman 5 has 1604193 kill(s), 843410 death(s), and 156590 wins.Their K/D ratio is 1.902% and W/L ratio is 15.659%.
Gunman 6 has 2141183 kill(s), 786987 death(s), and 213013 wins.Their K/D ratio is 2.7207% and W/L ratio is 21.301%.
Gunman 7 has 2479370 kill(s), 789069 death(s), and 210931 wins.Their K/D ratio is 3.1421% and W/L ratio is 21.093%.
Gunman 8 has 2585590 kill(s), 842391 death(s), and 157609 wins.Their K/D ratio is 3.0693% and W/L ratio is 15.761%.
Gunman 9 has 2536887 kill(s), 909367 death(s), and 90633 wins.Their K/D ratio is 2.7897% and W/L ratio is 9.0633%.
Gunman 10 has 2423061 kill(s), 959625 death(s), and 40375 wins.Their K/D ratio is 2.525% and W/L ratio is 4.0375%.
Gunman 11 has 2314696 kill(s), 985936 death(s), and 14064 wins.Their K/D ratio is 2.3477% and W/L ratio is 1.4064%.
Gunman 12 has 2228664 kill(s), 996165 death(s), and 3835 wins.Their K/D ratio is 2.2372% and W/L ratio is 0.3835%.
Gunman 13 has 2159860 kill(s), 999156 death(s), and 844 wins.Their K/D ratio is 2.1617% and W/L ratio is 0.0844%.
Gunman 14 has 2107469 kill(s), 999862 death(s), and 138 wins.Their K/D ratio is 2.1078% and W/L ratio is 0.0138%.
Gunman 15 has 2065018 kill(s), 999983 death(s), and 17 wins.Their K/D ratio is 2.0651% and W/L ratio is 0.0017%.
Gunman 16 has 2026960 kill(s), 999999 death(s), and 1 wins.Their K/D ratio is 2.027% and W/L ratio is 0.0001%.
Gunman 17 has 1992470 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 1.9925% and W/L ratio is 0%.
Gunman 18 has 1962486 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 1.9625% and W/L ratio is 0%.
Gunman 19 has 1933011 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 1.933% and W/L ratio is 0%.
Gunman 20 has 1901863 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 1.9019% and W/L ratio is 0%.
Gunman 21 has 1876897 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 1.8769% and W/L ratio is 0%.
Gunman 22 has 1847543 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 1.8475% and W/L ratio is 0%.
Gunman 23 has 1820993 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 1.821% and W/L ratio is 0%.
Gunman 24 has 1795069 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 1.7951% and W/L ratio is 0%.
Gunman 25 has 1769178 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 1.7692% and W/L ratio is 0%.
Gunman 26 has 1741454 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 1.7415% and W/L ratio is 0%.
Gunman 27 has 1715216 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 1.7152% and W/L ratio is 0%.
Gunman 28 has 1687161 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 1.6872% and W/L ratio is 0%.
Gunman 29 has 1664380 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 1.6644% and W/L ratio is 0%.
Gunman 30 has 1635557 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 1.6356% and W/L ratio is 0%.
Gunman 31 has 1608821 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 1.6088% and W/L ratio is 0%.
Gunman 32 has 1584830 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 1.5848% and W/L ratio is 0%.
Gunman 33 has 1558481 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 1.5585% and W/L ratio is 0%.
Gunman 34 has 1529587 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 1.5296% and W/L ratio is 0%.
Gunman 35 has 1502761 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 1.5028% and W/L ratio is 0%.
Gunman 36 has 1479450 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 1.4794% and W/L ratio is 0%.
Gunman 37 has 1455012 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 1.455% and W/L ratio is 0%.
Gunman 38 has 1427893 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 1.4279% and W/L ratio is 0%.
Gunman 39 has 1392872 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 1.3929% and W/L ratio is 0%.
Gunman 40 has 1360868 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 1.3609% and W/L ratio is 0%.
Gunman 41 has 1331551 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 1.3316% and W/L ratio is 0%.
Gunman 42 has 1308009 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 1.308% and W/L ratio is 0%.
Output continued:
Gunman 43 has 1296051 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 1.2961% and W/L ratio is 0%.
Gunman 44 has 1278110 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 1.2781% and W/L ratio is 0%.
Gunman 45 has 1250671 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 1.2507% and W/L ratio is 0%.
Gunman 46 has 1212570 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 1.2126% and W/L ratio is 0%.
Gunman 47 has 1161931 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 1.1619% and W/L ratio is 0%.
Gunman 48 has 1112547 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 1.1125% and W/L ratio is 0%.
Gunman 49 has 1074612 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 1.0746% and W/L ratio is 0%.
Gunman 50 has 1052409 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 1.0524% and W/L ratio is 0%.
Gunman 51 has 1044987 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 1.045% and W/L ratio is 0%.
Gunman 52 has 1045834 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 1.0458% and W/L ratio is 0%.
Gunman 53 has 1048238 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 1.0482% and W/L ratio is 0%.
Gunman 54 has 1042029 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 1.042% and W/L ratio is 0%.
Gunman 55 has 1017169 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 1.0172% and W/L ratio is 0%.
Gunman 56 has 969726 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0.96973% and W/L ratio is 0%.
Gunman 57 has 901028 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0.90103% and W/L ratio is 0%.
Gunman 58 has 822971 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0.82297% and W/L ratio is 0%.
Gunman 59 has 748576 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0.74858% and W/L ratio is 0%.
Gunman 60 has 691956 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0.69196% and W/L ratio is 0%.
Gunman 61 has 656892 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0.65689% and W/L ratio is 0%.
Gunman 62 has 640424 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0.64042% and W/L ratio is 0%.
Gunman 63 has 637798 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0.6378% and W/L ratio is 0%.
Gunman 64 has 643232 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0.64323% and W/L ratio is 0%.
Gunman 65 has 650863 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0.65086% and W/L ratio is 0%.
Gunman 66 has 660759 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0.66076% and W/L ratio is 0%.
Gunman 67 has 669720 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0.66972% and W/L ratio is 0%.
Gunman 68 has 678350 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0.67835% and W/L ratio is 0%.
Gunman 69 has 681411 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0.68141% and W/L ratio is 0%.
Gunman 70 has 672154 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0.67215% and W/L ratio is 0%.
Gunman 71 has 638519 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0.63852% and W/L ratio is 0%.
Gunman 72 has 568946 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0.56895% and W/L ratio is 0%.
Gunman 73 has 460283 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0.46028% and W/L ratio is 0%.
Gunman 74 has 328504 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0.3285% and W/L ratio is 0%.
Gunman 75 has 204974 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0.20497% and W/L ratio is 0%.
Gunman 76 has 108095 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0.10809% and W/L ratio is 0%.
Gunman 77 has 48224 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0.048224% and W/L ratio is 0%.
Gunman 78 has 17680 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0.01768% and W/L ratio is 0%.
Gunman 79 has 5290 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0.00529% and W/L ratio is 0%.
Gunman 80 has 1328 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0.001328% and W/L ratio is 0%.
Gunman 81 has 271 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0.000271% and W/L ratio is 0%.
Gunman 82 has 49 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 4.9e-005% and W/L ratio is 0%.
Gunman 83 has 7 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 7e-006% and W/L ratio is 0%.
Gunman 84 has 1 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 1e-006% and W/L ratio is 0%.
Gunman 85 has 0 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0% and W/L ratio is 0%.
Gunman 86 has 0 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0% and W/L ratio is 0%.
Gunman 87 has 0 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0% and W/L ratio is 0%.
Gunman 88 has 0 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0% and W/L ratio is 0%.
Gunman 89 has 0 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0% and W/L ratio is 0%.
Gunman 90 has 0 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0% and W/L ratio is 0%.
Gunman 91 has 0 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0% and W/L ratio is 0%.
Gunman 92 has 0 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0% and W/L ratio is 0%.
Gunman 93 has 0 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0% and W/L ratio is 0%.
Gunman 94 has 0 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0% and W/L ratio is 0%.
Gunman 95 has 0 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0% and W/L ratio is 0%.
Gunman 96 has 0 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0% and W/L ratio is 0%.
Gunman 97 has 0 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0% and W/L ratio is 0%.
Gunman 98 has 0 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0% and W/L ratio is 0%.
Gunman 99 has 0 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0% and W/L ratio is 0%.
Gunman 100 has 0 kill(s), 1000000 death(s), and 0 wins.Their K/D ratio is 0% and W/L ratio is 0%.


Which program do you guys think is more accurate?

[edit]To be honest I think it is the win ratio not win loss ratio because I never go the loses but I guess the loses would be RUNS - wins[/edit]
Last edited on
Topic archived. No new replies allowed.
Pages: 12