Random float number generation

后端 未结 14 1592
孤城傲影
孤城傲影 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条回答
  •  刺人心
    刺人心 (楼主)
    2020-11-22 05:32

    If you know that your floating point format is IEEE 754 (almost all modern CPUs including Intel and ARM) then you can build a random floating point number from a random integer using bit-wise methods. This should only be considered if you do not have access to C++11's random or Boost.Random which are both much better.

    float rand_float()
    {
        // returns a random value in the range [0.0-1.0)
    
        // start with a bit pattern equating to 1.0
        uint32_t pattern = 0x3f800000;
    
        // get 23 bits of random integer
        uint32_t random23 = 0x7fffff & (rand() << 8 ^ rand());
    
        // replace the mantissa, resulting in a number [1.0-2.0)
        pattern |= random23;
    
        // convert from int to float without undefined behavior
        assert(sizeof(float) == sizeof(uint32_t));
        char buffer[sizeof(float)];
        memcpy(buffer, &pattern, sizeof(float));
        float f;
        memcpy(&f, buffer, sizeof(float));
    
        return f - 1.0;
    }
    

    This will give a better distribution than one using division.

提交回复
热议问题