How do i generate a random number but exclude some of them?

alright,so i need to generate a random number.
its a number between 1-54
this is a bad explanation of the program feel free to skip
---------------------------------
the program draws cards so thats why its 54
now the thing is,i need the program to draw a specific set of cards,and end when it draws them.
the way it checks if the cards are the ones that i need is because the sum of their value is below 33.
or atleast thats what i thought,turns out you can make the value of 33 with other combos aswell.
--------------------------------------------
so back to the question,i need a random number generated from 1-8,and then from 19-65.
i thought about checking with an if statement,but i dont think that would work since it would check only once or twice,and then go on..
so is there any easier way.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
   srand( time(NULL));
   int CardsRolled[6];
    int sum=34;
    int numb=0;
    while(sum>33){
        sum=0;


        cout<<"\n";

        cout<<numb<<"---";
        for(int i=0;i<6;i++){

            int xRan;
	xRan=rand()%54+1;

this is the part of the code that generates the random number
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <cstdlib>

using namespace std;

int random(int from, int to)
{
    return from + rand() % (to - from + 1);
}

int main()
{
   // I need a random number generated from 1-8, and then from 19-65.

    cout << random(1, 8)   << endl;
    cout << random(19, 65) << endl;
}
thanks for the code bro,but wouldn't this generate two numbers,one from 1-8
and one from 19-65.
i think i worded the question wrong so its my fault.
i need 1 number to be generated that follows those rules.
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
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int random(int from, int to)
{
    return from + rand() % (to - from + 1);
}

int main()
{
    // I need a random number generated from 1-8, and then from 19-65.
    srand(time(nullptr));
    int myRand;

    if (random(0,1))
    {
        myRand = random(1, 8);
    }
    else
    {
        myRand = random(19, 65);
    }

    cout << myRand << endl;
}


:)
EDIT: seeded the rng
Last edited on
alright thanks to both of you i think i know what to do now
The method I showed probably isn't what you want. Since one of those ranges is larger than the other, the fact that either range is decided upon by coin-toss practically means that each number in the smaller range will appear more frequently than any number in the larger range.
Argh. Two suggestions:

1. Split the range. (1-8 == 9 cards) + (19-65 == 47 cards) = 56 cards.

1
2
int c = get_random_number_in( 1, 56 );
if (c > 8) c += 10; // 9-->19, etc. 

2. Throw away invalid numbers

1
2
3
4
int c;
do {
  c = get_random_number_in( 1, 65 );
} while ((c > 8) && (c < 19));

Hope this helps.
What CARD game are we emulating here OP? Because I have a feeling that you're going about this all wrong. Random number generation is not your solution to this.

You're talking about a standard deck of cards, 54 cards so that's 40 number cards, 12 faces and 2 jokers correct? Since you can only draw a card once, you need to prevent duplicate entries. Now you could keep building on the random number generation like you asked for until it becomes a complete mess of code. Or you could populate a vector with the values of each card in the deck, then apply std::random_shuffle() to that vector and pop the results off the top of the array just like you do with a real deck of cards in meat space. I can post some code if you want, but the code I had in mind to copy and paste into here is basically me screwing around with Lambda's so I'd have to clean it up and make it readable first.
@booradley yes,the method you gave me worked,but what you said happened,and thats why the program didn't work correctly
thanks for the reply computer geek.
the card game i am emulating is called makao where i live.'
the rules are unimportant,what is important for this is that,the A cards and the 8 cards are cards used for skipping a player.so if i throw and A spade for example,the next player loses his turn.
this program is just drawing cards untill a full hand of cards that skip is drawn(one hand consists of 6 cards).
and each time a hand is drawn the deck is reset.
also,i have VERY limited experience in c++,and i sort of challenged myself to write this program no matter how bad,unoptimized or stupid it is.
i have no idea how to use half of the things you said.
i will post the code to my program here,its long but 90% of it is just repetition i could have probably skipped if i had more experience.
the program needs to end only when a hand consists of only 8ts and Aces
and not any other number.i think i messed up in the checking of the hand part so it doesn't work now.
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
#include <iostream>
#include <ctime>
#include <stdlib.h>
#include <cmath>
using namespace std;

int main(){
    srand( time(NULL));
   int CardsRolled[6];
    int sum=34;
    int numb=0;
    while(sum>33||CardsRolled[0,1,2,3,4,5]==9||10||11||12||13||14||15||16||17||18){
        sum=0;


        cout<<"\n";

        cout<<numb<<"---";
        for(int i=0;i<6;i++){




            int xRan;
	xRan=rand()%54+1;
//this checks if the number has been rolled before and if it has gets a new 
//one,it isn't 100% though
    if(xRan==CardsRolled[0]||xRan==CardsRolled[1]||xRan==CardsRolled[2]||xRan==CardsRolled[3]||xRan==CardsRolled[4]||xRan==CardsRolled[5]){
        xRan=rand()%54+1;
    } if(xRan==CardsRolled[0]||xRan==CardsRolled[1]||xRan==CardsRolled[2]||xRan==CardsRolled[3]||xRan==CardsRolled[4]||xRan==CardsRolled[5]){
        xRan=rand()%54+1;
    }if(xRan==CardsRolled[0]||xRan==CardsRolled[1]||xRan==CardsRolled[2]||xRan==CardsRolled[3]||xRan==CardsRolled[4]||xRan==CardsRolled[5]){
        xRan=rand()%54+1;
    }if(xRan==CardsRolled[0]||xRan==CardsRolled[1]||xRan==CardsRolled[2]||xRan==CardsRolled[3]||xRan==CardsRolled[4]||xRan==CardsRolled[5]){
        xRan=rand()%54+1;
    }if(xRan==CardsRolled[0]||xRan==CardsRolled[1]||xRan==CardsRolled[2]||xRan==CardsRolled[3]||xRan==CardsRolled[4]||xRan==CardsRolled[5]){
        xRan=rand()%54+1;
    }if(xRan==CardsRolled[0]||xRan==CardsRolled[1]||xRan==CardsRolled[2]||xRan==CardsRolled[3]||xRan==CardsRolled[4]||xRan==CardsRolled[5]){
        xRan=rand()%54+1;
    }if(xRan==CardsRolled[0]||xRan==CardsRolled[1]||xRan==CardsRolled[2]||xRan==CardsRolled[3]||xRan==CardsRolled[4]||xRan==CardsRolled[5]){
        xRan=rand()%54+1;
    }if(xRan==CardsRolled[0]||xRan==CardsRolled[1]||xRan==CardsRolled[2]||xRan==CardsRolled[3]||xRan==CardsRolled[4]||xRan==CardsRolled[5]){
        xRan=rand()%54+1;
    }if(xRan==CardsRolled[0]||xRan==CardsRolled[1]||xRan==CardsRolled[2]||xRan==CardsRolled[3]||xRan==CardsRolled[4]||xRan==CardsRolled[5]){
        xRan=rand()%54+1;
    }if(xRan==CardsRolled[0]||xRan==CardsRolled[1]||xRan==CardsRolled[2]||xRan==CardsRolled[3]||xRan==CardsRolled[4]||xRan==CardsRolled[5]){
        xRan=rand()%54+1;
    }else{

	switch(xRan){
case 1:
    cout<<"1a,";
    CardsRolled[i]=xRan;
    break;
case 2:
    cout<<"1b,";
    CardsRolled[i]=xRan;
    break;
case 3:
    cout<<"1c,";
    CardsRolled[i]=xRan;
    break;
case 4:
    cout<<"1d,";
    CardsRolled[i]=xRan;
    break;
case 5:
    cout<<"8a,";
    CardsRolled[i]=xRan;
    break;
case 6:
    cout<<"8b,";
    CardsRolled[i]=xRan;
    break;
case 7:
    cout<<"8c,";
    CardsRolled[i]=xRan;
    break;
case 8:
    cout<<"8d,";
    CardsRolled[i]=xRan;
    break;
case 9:
    cout<<"2a,";
    CardsRolled[i]=xRan;
    break;
case 10:
    cout<<"2b,";
    CardsRolled[i]=xRan;
    break;
case 11:
    cout<<"2c,";
    CardsRolled[i]=xRan;
    break;
case 12:
    cout<<"2d,";
    CardsRolled[i]=xRan;
    break;
case 13:
    cout<<"3a,";
    CardsRolled[i]=xRan;
    break;
case 14:
    cout<<"3b,";
    CardsRolled[i]=xRan;
    break;
case 15:
    cout<<"3c,";
    CardsRolled[i]=xRan;
    break;
case 16:
    cout<<"3d,";
    CardsRolled[i]=xRan;
    break;
case 17:
    cout<<"joker,";
    break;
case 18:
    cout<<"4a,";
    CardsRolled[i]=xRan;
    break;
case 19:
    cout<<"4b,";
    CardsRolled[i]=xRan;
    break;

case 20:
    cout<<"4c,";
    CardsRolled[i]=xRan;
    break;
case 21:
    cout<<"4d,";
    CardsRolled[i]=xRan;
    break;
case 22:
    cout<<"5a,";
    CardsRolled[i]=xRan;
    break;
case 23:
    cout<<"5b,";
    CardsRolled[i]=xRan;
    break;
case 24:
    cout<<"5c,";
    CardsRolled[i]=xRan;
    break;
case 25:
    cout<<"5d,";
    CardsRolled[i]=xRan;
    break;
case 26:
    cout<<"6a,";
    CardsRolled[i]=xRan;
    break;
case 27:
    cout<<"6b,";
    CardsRolled[i]=xRan;
    break;
case 28:
    cout<<"6c,";
    CardsRolled[i]=xRan;
    break;
case 29:
    cout<<"6d,";
    CardsRolled[i]=xRan;
    break;
case 30:
    cout<<"7a,";
    CardsRolled[i]=xRan;
    break;
case 31:
    cout<<"7b,";
    CardsRolled[i]=xRan;
    break;
case 32:
    cout<<"7c,";
    CardsRolled[i]=xRan;
    break;
case 33:
    cout<<"7d,";
    CardsRolled[i]=xRan;
    break;
case 34:
    cout<<"Ka,";
    CardsRolled[i]=xRan;
    break;
case 35:
    cout<<"Kb,";
    CardsRolled[i]=xRan;
    break;
case 36:
    cout<<"Kc,";
    CardsRolled[i]=xRan;
    break;
case 37:
    cout<<"Kd,";
    CardsRolled[i]=xRan;
    break;
case 38:
    cout<<"9a,";
    CardsRolled[i]=xRan;
    break;
case 39:
    cout<<"9b,";
    CardsRolled[i]=xRan;
    break;
case 40:
    cout<<"9c,";
    CardsRolled[i]=xRan;
    break;
case 41:
    cout<<"9d,";
    CardsRolled[i]=xRan;
    break;
case 42:
    cout<<"10a,";
    CardsRolled[i]=xRan;
    break;
case 43:
    cout<<"10b,";
    CardsRolled[i]=xRan;
    break;
case 44:
    cout<<"10c,";
    CardsRolled[i]=xRan;
    break;
case 45:
    cout<<"10d,";
    CardsRolled[i]=xRan;
    break;
case 46:
    cout<<"Ja,";
    CardsRolled[i]=xRan;
    break;
case 47:
    cout<<"Jb,";
    CardsRolled[i]=xRan;
    break;
case 48:
    cout<<"Jc,";
    CardsRolled[i]=xRan;
    break;
case 49:
    cout<<"Jd,";
    CardsRolled[i]=xRan;
    break;
case 50:
    cout<<"Qa,";
    CardsRolled[i]=xRan;
    break;
case 51:
    cout<<"Qb,";
    CardsRolled[i]=xRan;
    break;
case 52:
    cout<<"Qc,";
    CardsRolled[i]=xRan;
    break;
case 53:
    cout<<"Qd,";
    CardsRolled[i]=xRan;
    break;
case 54:
    cout<<"Joker,";
    CardsRolled[i]=xRan;
    break;


	}
    }

        sum+=CardsRolled[i];


        }
numb++;

    }

    }





using this code it just runs forever
Last edited on
Topic archived. No new replies allowed.