c++algorithmrandomprnggenetic

Generating a random double between a range of values


Im currently having trouble generating random numbers between -32.768 and 32.768. It keeps giving me the same values but with a small change in the decimal field. ex : 27.xxx.

Heres my code, any help would be appreciated.

#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;

int main()
{
    srand( time(NULL) );
    double r = (68.556*rand()/RAND_MAX - 32.768);
    cout << r << endl;
    return 0;
}

Solution

  • I should mention if you're using a C++11 compiler, you can use something like this, which is actually easier to read and harder to mess up:

    #include <random>
    #include <iostream>
    #include <ctime>
    
    
    int main()
    {
        //Type of random number distribution
        std::uniform_real_distribution<double> dist(-32.768, 32.768);  //(min, max)
    
        //Mersenne Twister: Good quality random number generator
        std::mt19937 rng; 
        //Initialize with non-deterministic seeds
        rng.seed(std::random_device{}()); 
    
        // generate 10 random numbers.
        for (int i=0; i<10; i++)
        {
          std::cout << dist(rng) << std::endl;
        }
        return 0;
    }
    

    As bames53 pointed out, the above code can be made even shorter if you make full use of c++11:

    #include <random>
    #include <iostream>
    #include <ctime>
    #include <algorithm>
    #include <iterator>
    
    int main()
    {
        std::mt19937 rng; 
        std::uniform_real_distribution<double> dist(-32.768, 32.768);  //(min, max)
        rng.seed(std::random_device{}()); //non-deterministic seed
        std::generate_n( 
             std::ostream_iterator<double>(std::cout, "\n"),
             10, 
             [&]{ return dist(rng);} ); 
        return 0;
    }