Random float number generation

后端 未结 14 1675
孤城傲影
孤城傲影 2020-11-22 05:05

How do I generate random floats in C++?

I thought I could take the integer rand and divide it by something, would that be adequate enough?

14条回答
  •  闹比i
    闹比i (楼主)
    2020-11-22 05:34

    #include 
    #include 
    #include 
    
    using namespace std;
    
    /* single precision float offers 24bit worth of linear distance from 1.0f to 0.0f */
    float getval() {
        /* rand() has min 16bit, but we need a 24bit random number. */
        uint_least32_t r = (rand() & 0xffff) + ((rand() & 0x00ff) << 16);
        /* 5.9604645E-8 is (1f - 0.99999994f), 0.99999994f is the first value less than 1f. */
        return (double)r * 5.9604645E-8;
    }
    
    int main()
    {
        srand(time(NULL));
    ...
    

    I couldn't post two answers, so here is the second solution. log2 random numbers, massive bias towards 0.0f but it's truly a random float 1.0f to 0.0f.

    #include 
    #include 
    #include 
    
    using namespace std;
    
    float getval () {
        union UNION {
            uint32_t i;
            float f;
        } r;
        /* 3 because it's 0011, the first bit is the float's sign.
         * Clearing the second bit eliminates values > 1.0f.
         */
        r.i = (rand () & 0xffff) + ((rand () & 0x3fff) << 16);
        return r.f;
    }
    
    int main ()
    {
        srand (time (NULL));
    ...
    

提交回复
热议问题