Public Group

random doubles?

This topic is 3898 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

Recommended Posts

Whats a fast way to get a random double? I tried the code below but it breaks if the resulting int is too big... If I only multiply by 100 or 10 then I don't get the accuracy I need for some things...
double number= range_min + (rand()%(int)((range_max - range_min)*1000))/1000;



Share on other sites
Well, rand() only returns values up to RAND_MAX. So you may want to randomly select a range of double values with one call to rand(), then select a random value within that range with a second call to rand()... or something like that. Simply multiplying a result by 10 or 100 doesn't increase the accuracy... you are still limited by the output space of rand().

EDIT:

Why not just do this?
double num = range_min + ((double)rand() / (double)RAND_MAX) * (range_max - range_min);

You're still limited, though, to RAND_MAX distinct values.

Share on other sites
the reason I did *1000 ... /1000

is so say "1.567" becomes "1567" when I cast to int. every time I tried "rand()%1.567" I got an error that "1.567" is not an integer...

the problem isn't rand only returning a limiteed value. It's getting my double to an int so that % doesn't give an error without looseing precision...

I'll try your alternative way as that doesn't reley on a division remainder.

Share on other sites
Another alternative is to use another algorithm that gives you doubles right away. A popular choice is Mersenne twister [wikipedia] which is quite fast and can output to different types. Near the bottom of the wikipedia-page is some links to implementations in different languages and some of them seem to have what you want.

Share on other sites
Of course, there's also always boost::random.

1. 1
2. 2
3. 3
Rutin
22
4. 4
5. 5

• 13
• 19
• 14
• 9
• 9
• Forum Statistics

• Total Topics
632931
• Total Posts
3009292
• Who's Online (See full list)

There are no registered users currently online

×