Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What difference between rand() and random() functions?

Tags:

Once, my teacher taught me to use randomize() and random() function for generating pseudorandom numbers in C++ Builder. Now I prefer working in VS 2012, but when I tried to use these functions there it says that "identifier not found", even when I added #include <stdlib.h>. After some time of Googling I found that there are also rand() and srand() functions. What is the difference between them and which is it better to use?

like image 629
Sunrise Avatar asked Sep 10 '13 18:09

Sunrise


People also ask

Is the rand function random?

Description. RAND returns an evenly distributed random real number greater than or equal to 0 and less than 1. A new random real number is returned every time the worksheet is calculated. Note: As of Excel 2010, Excel uses the Mersenne Twister algorithm (MT19937) to generate random numbers.

What is the difference between NP random rand () and NP random randn ()?

randn generates samples from the normal distribution, while numpy. random. rand from a uniform distribution (in the range [0,1)).

What does Numpy random rand () do?

numpy. random. rand() function is used to generate random float values from an uniform distribution over [0,1) . These values can be extracted as a single value or in arrays of any dimension.

What is rand () distribution?

X = rand returns a random scalar drawn from the uniform distribution in the interval (0,1). example. X = rand( n ) returns an n -by- n matrix of uniformly distributed random numbers.


2 Answers

randomize() and random() are not part of the standard library. Perhaps your teacher wrote functions with these names for use in your class, or maybe you really mean random() and srandom() which are part of POSIX and not available on Windows. rand() and srand() are part of the standard library and will be provided by any standard conforming implementation of C++.


You should avoid rand() and srand() and use the new C++11 <random> library. <random> was added as part of the C++11 standard (and VS2012 does provide it).

Video explaining why: rand() Considered Harmful

  • rand() is typically a low quality pRNG and not suitable for applications that need a reasonable level of unpredictability. <random> provides a variety of engines with different characteristics suitable for many different use cases.

  • Converting the results of rand() into a number you can use directly usually relies on code that is difficult to read and easy to get wrong, whereas using <random> distributions is easy and produces readable code.

  • The common methods of generating values in a given distribution using rand() further decrease the quality of the generated data. % generally biases the data and floating point division still produces non-uniform distributions. <random> distributions are higher quality as well as more readable.

  • rand() relies on a hidden global resource. Among other issues this causes rand() to not be thread safe. Some implementations make thread safety guarantees, but this is not required standard. Engines provided by <random> encapsulate pRNG state as objects with value semantics, allowing flexible control over the state.

  • srand() only permits a limited range of seeds. Engines in <random> can be initialized using seed sequences which permit the maximum possible seed data. seed_seq also implements a common pRNG warm-up.


example of using <random>:

#include <iostream> #include <random>  int main() {   // create source of randomness, and initialize it with non-deterministic seed   std::random_device r;   std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()};   std::mt19937 eng{seed};    // a distribution that takes randomness and produces values in specified range   std::uniform_int_distribution<> dist(1,6);    for (int i=0; i<100; ++i) {     std::cout << dist(eng) << '\n';   } } 
like image 72
bames53 Avatar answered Sep 29 '22 01:09

bames53


Although there are (obviously, above) people who will assert with religious fervor that rand() is bad and random() is not, it turns out that your mileage may vary. Here's the gcc answer to the question of "What's the difference...", as supplied by the gcc version of stdlib.h (emphasis added):

/* These are the functions that actually do things. The random',srandom', initstate' andsetstate' functions are those from BSD Unices. The rand' andsrand' functions are required by the ANSI standard. We provide both interfaces to the same random number generator. / / Return a random long integer between 0 and RAND_MAX inclusive. */

like image 28
Atlant Avatar answered Sep 29 '22 01:09

Atlant