Hi How I can get in C++ random value from 01 to 12?
So I will have 03, or 06, or 11?
Hi How I can get in C++ random value from 01 to 12?
So I will have 03, or 06, or 11?
#include <iomanip>
#include <iostream>
#include <stdlib.h>
#include <time.h>
// initialize random seed
srand( time(NULL) );
// generate random number
int randomNumber = rand() % 12 + 1;
// output, as you seem to wan a '0'
cout << setfill ('0') << setw (2) << randomNumber;
to adress dirkgently's issue maybe something like that would be better?
// generate random number
int randomNumber = rand()>>4; // get rid of the first 4 bits
// get the value
randomNumer = randomNumer % 12 + 1;
edit after mre and dirkgently's comments
Use the following formula:
M + rand() / (RAND_MAX / (N - M + 1) + 1), M = 1, N = 12
and read up on this FAQ.
Edit: Most answers on this question do not take into account the fact that poor PRN generators (typically offered with the library function rand()
) are not very random in the low order bits. Hence:
rand() % 12 + 1
is not good enough.
You can do this, for example:
#include <cstdlib>
#include <cstdio>
#include <time.h>
int main(int argc, char **argv)
{
srand(time(0));
printf("Random number between 1 and 12: %d", (rand() % 12) + 1);
}
The srand
function will seed the random number generator with the current time (in seconds) - that's the way it's usually done, but there are also more secure solutions.
rand() % 12
will give you a number between 0 and 11 (%
is the modulus operator), so we add 1 here to get to your desired range of 1 to 12.
In order to print 01 02 03 and so on instead of 1 2 3, you can format the output:
printf("Random number between 01 and 12: %02d", (rand() % 12) + 1);
Is there some significance to the leading zero in this case? Do you intend for it to be octal, so the 12
is really 10 (in base 10)?
Getting a random number within a specified range is fairly straightforward:
int rand_lim(int limit) {
/* return a random number between 0 and limit inclusive.
*/
int divisor = RAND_MAX/(limit+1);
int retval;
do {
retval = rand() / divisor;
} while (retval > limit);
return retval;
}
(The while loop is to prevent skewed results -- some outputs happening more often than others). Skewed results are almost inevitable when/if you use division (or its remainder) directly.
If you want to print it out so even one-digit numbers show two digits (i.e. a leading 0), you can do something like:
std::cout << std::setw(2) << std::setprecision(2) << std::setfill('0') << number;
Probably not terribly speed efficient - but wouldn't the best way to spread evenly across the entire range of RAND_MAX be to simply raise the result to an approriate (fractional) power?
eg. If RAND_MAX is 32768 and you want 0-12 then
RAND_MAX ^ x = 12, so x = ln(12)/ln(32768) = 0.2389
and result = pow(rand(),0.2389)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/time.h>
int get_random(int n) {
struct timeval num;
gettimeofday(&num, NULL);
srand(num.tv_usec);
return rand() % n + 1;
}
int main () {
printf("Random number between 1 and 12: %d \n", get_random(12));
return 0;
}