# srand() + rand() with local scope

Solution for srand() + rand() with local scope
is Given Below:

I have a function that calls srand and rand like this:

``````void foo() {
int seed = some_operation();
std::srand(seed);
int value = std::rand();
// Do something with random value
}
``````

However, I don’t want to change the global state of rand. Whats the easiest way to get a random number then?

Requirements:

• random number must be deterministic based on seed
• C++11 is fine
• foo should be thread safe
• the global state of rand should not be modified

Edit:

There is a stackoverflow question asking how to generate random numbers. The accepted answer however shows how to generate truly unique random numbers, using a slow std::random_device. I just needed a simple generator using a fixed seed instead.

C++11 is fine

Then use the new pseudorandom number library:

``````#include <random>

int foo() {
int seed = some_operation();
std::minstd_rand rand(seed);
int value = rand();
// Do something with random value
}
``````

`minstd_rand` is a simple linear congruential engine, similar to that typically used by `std::rand()`, but with its state encapsulated in a class. Other engines are available, if you need a higher quality pseudorandom sequence. The Mersenne Twister, `std::mt19937`, is usually a good choice if you don’t have specific requirements.

`<random>` defines a number of PRNG classes that you can use, which do not use global states.

For example, using a default Mersenne Twister, `std::mt19937`:

``````#include <iostream>
#include <random>

int main() {
int seed = 1234;
std::mt19937 rng(seed);
std::cout << "Random number: " << rng() << std::endl;
}
``````

One approach is to provide your own implementation, with its own seed data. A template for doing that is provided in the manpage for rand().

``````static unsigned long next = 1;

/* RAND_MAX assumed to be 32767 */
int myrand(void) {
next = next * 1103515245 + 12345;
return((unsigned)(next/65536) % 32768);
}

void mysrand(unsigned seed) {
next = seed;
}
``````