Summary of methods for generating pseudo-random numbers by using rand () and srand () in C Language

Source: Internet
Author: User

The standard library <cstdlib> (included in <iostream>) provides two functions to help generate pseudo-random numbers:

Function 1: int rand (void );
Returns a random integer between [seed, RAND_MAX (0x7fff) starting from the seed specified in srand (seed.

Function 2: void srand (unsigned seed );
The seed parameter is the seed of rand () and used to initialize the starting value of rand.

It can be considered that rand () is viewed every time it is called:
1) If you have previously called srand (seed) and specified a value for seed, it will automatically call srand (seed) once to initialize its starting value.
2) If you have not called srand (seed) before, it will automatically call srand (1) once.

Based on the first point above, we can conclude that:
1) If you want rand () to generate different values each time the program runs, you must change the value of seed in srand (seed, this variable value must be different each time the program runs (for example, the time elapsed so far ).
2) Otherwise, if you specify a value for seed, the value generated by rand () will be the same each time the program runs, although the value will be [seed, RAND_MAX (0x7fff )) between a random value.
3) If srand (seed) is not called before calling rand (), the effect will be the same as calling rand (1) and then calling rand () (1 is also a set value ).

For example, we want to obtain 0 ~ Random integer between 6 (excluding 6 itself ):

Example 1: do not specify seed:
For (int I = 0; I <10; I ++ ){
Ran_num = rand () % 6;
Cout <ran_num <"";
}
Output for each operation: 5 5 4 4 5 4 0 4 2

Example 2: Specify seed as the value 1:
Srand (1 );
For (int I = 0; I <10; I ++ ){
Ran_num = rand () % 6;
Cout <ran_num <"";
}
Output for each operation: 5 5 4 4 5 4 0 4 2
The result is exactly the same as that of Example 1.

Example 3: Specify seed as the value 6:
Srand (6 );
For (int I = 0; I <10; I ++ ){
Ran_num = rand () % 6;
Cout <ran_num <"";
}
Output after each operation: 4 1 5 1 4 3 4 2 2
The random value is also between [0, 6). The random value is different from srand (1), but the result of each running is the same.

Example 4: Specify the seed as the elapsed time of the current system (unit: seconds): time_t time (0 ):
# Include <ctime>
//...
Srand (unsigned) time (0 ));
For (int I = 0; I <10; I ++ ){
Ran_num = rand () % 6;
Cout <ran_num <"";
}
Output at first run: 0 1 5 4 5 0 2 3 4 2
Second: 3 2 3 0 3 5 5 2 2 3
In short, each running result will be different because the time at which each program is started is different (the interval must be greater than 1 second ?, See ).

About time_t time (0 ):

Time_t is defined as a long integer. It returns the time elapsed since 00:00:00, January 1, January 1, 1970, in seconds. For example, assume that the output is:
Cout <time (0 );
The value is about 1169174701, which is equal to 37 (year) multiplied by 365 (days) multiplied by 24 (hours) multiplied by 3600 (seconds) (months and days are not counted ).

In addition, about ran_num = rand () % 6,

It is necessary to evaluate the modulo between the return value of rand () and 6, so that the random number of the target falls between [). Otherwise, the return value of rand () may be huge.
A general formula is:
To obtain a random integer between [a, B), use (RAND () % (B-a) + a (the result value will contain a Excluding B ).
When a is 0, it is abbreviated as rand () % B.

Finally, the pseudo-random Floating Point Number:

Use rand ()/double (rand_max) to obtain 0 ~ The floating point between 1 (note that, unlike the integer formula, it is divided by, not the modulo), for example:
Double rand_numf = 0.0;
Srand (unsigned) time (0 ));
For (INT I = 0; I <10; I ++ ){
Ran_numf = rand ()/(double) (rand_max );
Cout <ran_numf <"";
}
Running result: 0.716636, 0.457725 ,... And so on ~ The floating point number between 1 and the result is different each time.

If you want to get a larger range of random floating point numbers, such as 1 ~ 10.
Rand ()/(double) (RAND_MAX) to rand ()/(double) (RAND_MAX/10)
Running result: 7.19362, 6.45775 ,... And so on ~ The floating point number between 10 and the result is different each time.
As for, and so on.

The above is not the best implementation method for pseudo-random floating-point numbers, but it can be used...

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.