Problem with random

Hey guys, I'm trying to make a "horse race" with the drawings moving across the screen by creating a random number of spaces for each one that pushes them aside, my problem is that the first horse always wins, if I modify line 40 and call random for the second horse before the first then the second always wins, is there a way to make both of them have a 50/50 chance of winning? I'm running Borland 5.02.

Thanks

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
#include <iostream>
#include <conio>
#include <windows.h>
#include <iomanip>
#include <stdlib.h>
#include <time.h>
int main(){
int weightUno = 0, weightDos = 0;
cout<<"HORSE RACE"<<endl;
getch();
clrscr();
while((weightUno < 70) || (weightDos < 70))
{
   cout<<setw(weightUno)<<""<<"                      ;;  "<<endl
       <<setw(weightUno)<<""<<"                   ,;;'\\  "<<endl
       <<setw(weightUno)<<""<<"        __       ,;;' ' \\ "<<endl
       <<setw(weightUno)<<""<<"      /'  '\\'~~'~' \\ /'\\.)"<<endl
       <<setw(weightUno)<<""<<"   ,;(      )ONE /  |.    "<<endl
       <<setw(weightUno)<<""<<"  ,;' \\    /-.,,(   ) \\   "<<endl
       <<setw(weightUno)<<""<<"        ) /       ) / )|   "<<endl
       <<setw(weightUno)<<""<<"        ||        ||  \\)   "<<endl
       <<setw(weightUno)<<""<<"       (_\\       (_\\      "<<endl<<endl;

   cout<<setw(weightDos)<<""<<"                      ;;  "<<endl
       <<setw(weightDos)<<""<<"                   ,;;'\\  "<<endl
       <<setw(weightDos)<<""<<"        __       ,;;' ' \\ "<<endl
       <<setw(weightDos)<<""<<"      /'  '\\'~~'~' \\ /'\\.)"<<endl
       <<setw(weightDos)<<""<<"   ,;(      )TWO /  |.    "<<endl
       <<setw(weightDos)<<""<<"  ,;' \\    /-.,,(   ) \\   "<<endl
       <<setw(weightDos)<<""<<"        ) /       ) / )|   "<<endl
       <<setw(weightDos)<<""<<"        ||        ||  \\)   "<<endl
       <<setw(weightDos)<<""<<"       (_\\       (_\\      "<<endl;

   Sleep(1000);
   clrscr();
   if((weightUno >= 70) || (weightDos >= 70))
   {
      break;
   }
   weightUno = weightUno + 1+rand()%(5);
   weightDos = weightDos + 1+rand()%(5);
}
if(weightUno > weightDos)
{
   cout<<"NUMBER ONE WINS.";
}
else
{
   cout<<"NUMBER TWO WINS";
}
getch();
return 0;
}
Last edited on
The same set of random numbers are generated each time. A usual solution is to seed the random number generator based on the current time.

Add this line at the start of main().
 
	srand(time(0));

http://www.cplusplus.com/reference/cstdlib/srand/

A minor point, I try to avoid clscr() - well it is non-standard, but that's not the reason. It may introduce flicker. If available on your system, you might try gotoxy() instead.

One more thing - did you consider the race may end in a dead heat?

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
#include <iostream>
#include <conio>
#include <windows.h>
#include <iomanip>
#include <cstdlib>
#include <ctime>

using std::setw;
using std::cout;
using std::endl;

int main()
{

	srand(time(0));

	int weightUno = 0, weightDos = 0;
	cout << "HORSE RACE"<<endl;
	getch();
//	clrscr();

	while((weightUno < 70) || (weightDos < 70))
	{
	   gotoxy(1,4);  // position cursor for output at row 4 column 1

	   cout<<setw(weightUno)<<""<<"                      ;;  "<<endl
		   <<setw(weightUno)<<""<<"                   ,;;'\\  "<<endl
		   <<setw(weightUno)<<""<<"        __       ,;;' ' \\ "<<endl
		   <<setw(weightUno)<<""<<"      /'  '\\'~~'~' \\ /'\\.)"<<endl
		   <<setw(weightUno)<<""<<"   ,;(      )ONE /  |.    "<<endl
		   <<setw(weightUno)<<""<<"  ,;' \\    /-.,,(   ) \\   "<<endl
		   <<setw(weightUno)<<""<<"        ) /       ) / )|   "<<endl
		   <<setw(weightUno)<<""<<"        ||        ||  \\)   "<<endl
		   <<setw(weightUno)<<""<<"       (_\\       (_\\      "<<endl<<endl;

	   cout<<setw(weightDos)<<""<<"                      ;;  "<<endl
		   <<setw(weightDos)<<""<<"                   ,;;'\\  "<<endl
		   <<setw(weightDos)<<""<<"        __       ,;;' ' \\ "<<endl
		   <<setw(weightDos)<<""<<"      /'  '\\'~~'~' \\ /'\\.)"<<endl
		   <<setw(weightDos)<<""<<"   ,;(      )TWO /  |.    "<<endl
		   <<setw(weightDos)<<""<<"  ,;' \\    /-.,,(   ) \\   "<<endl
		   <<setw(weightDos)<<""<<"        ) /       ) / )|   "<<endl
		   <<setw(weightDos)<<""<<"        ||        ||  \\)   "<<endl
		   <<setw(weightDos)<<""<<"       (_\\       (_\\      "<<endl;

	   Sleep(1000);
//       clrscr();
       if((weightUno >= 70) || (weightDos >= 70))
       {
          break;
       }
       weightUno = weightUno + 1+rand()%(5);
       weightDos = weightDos + 1+rand()%(5);
    }

	if (weightUno > weightDos)
    {
       cout<<"NUMBER ONE WINS.";
    }
    else
    {
       cout<<"NUMBER TWO WINS";
    }

    getch();
    return 0;
}
Last edited on
There's also a problem - the main loop can exit in one of two different places.
There's the while loop condition at line 12:
while((weightUno < 70) || (weightDos < 70))
and there's the if statement at line 36:
if((weightUno >= 70) || (weightDos >= 70))
Because the variables are incremented at line 52/53, it will in fact mean the condition at line 12 terminates the loop. That means the final displayed position of the horses may not agree with the declared race result.
Thanks, Chervil!

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
#include <iostream>
#include <conio>
#include <windows.h>
#include <iomanip>
#include <stdlib.h>
#include <time.h>
int main(){
srand(time(0));
int weightUno = 0, weightDos = 0;
cout<<"HORSE RACE"<<endl;
getch();
while((weightUno < 70) || (weightDos < 70))
{
   if((weightUno >= 70) || (weightDos >= 70))
   {
      break;
   }
   gotoxy(1,4);

   cout<<setw(weightUno)<<""<<"                      ;;  "<<endl
       <<setw(weightUno)<<""<<"                   ,;;'\\  "<<endl
       <<setw(weightUno)<<""<<"        __       ,;;' ' \\ "<<endl
       <<setw(weightUno)<<""<<"      /'  '\\'~~'~' \\ /'\\.)"<<endl
       <<setw(weightUno)<<""<<"   ,;(      )ONE /  |.    "<<endl
       <<setw(weightUno)<<""<<"  ,;' \\    /-.,,(   ) \\   "<<endl
       <<setw(weightUno)<<""<<"        ) /       ) / )|   "<<endl
       <<setw(weightUno)<<""<<"        ||        ||  \\)   "<<endl
       <<setw(weightUno)<<""<<"       (_\\       (_\\      "<<endl<<endl;

   if((weightUno >= 70) || (weightDos >= 70))
   {
      break;
   }

   cout<<setw(weightDos)<<""<<"                      ;;  "<<endl
       <<setw(weightDos)<<""<<"                   ,;;'\\  "<<endl
       <<setw(weightDos)<<""<<"        __       ,;;' ' \\ "<<endl
       <<setw(weightDos)<<""<<"      /'  '\\'~~'~' \\ /'\\.)"<<endl
       <<setw(weightDos)<<""<<"   ,;(      )TWO /  |.    "<<endl
       <<setw(weightDos)<<""<<"  ,;' \\    /-.,,(   ) \\   "<<endl
       <<setw(weightDos)<<""<<"        ) /       ) / )|   "<<endl
       <<setw(weightDos)<<""<<"        ||        ||  \\)   "<<endl
       <<setw(weightDos)<<""<<"       (_\\       (_\\      "<<endl;

   Sleep(500);
   weightUno = weightUno + 1+rand()%(5);
   weightDos = weightDos + 1+rand()%(5);
}

if(weightUno > weightDos)
{
   gotoxy(1,25);
   cout<<"The Winner is NUMBER ONE!";
}

if(weightDos > weightUno)
{
   gotoxy(1,25);
   cout<<"The Winner is NUMBER TWO!";
}

if(weightDos == weightUno)
{
   gotoxy(1,25);
   cout<<"DEAD HEAT";
}

getch();
return 0;
}
Topic archived. No new replies allowed.