【问题标题】:Producing random float from negative to positive range?产生从负到正范围的随机浮动?
【发布时间】:2011-05-17 15:40:21
【问题描述】:

我正在尝试使用 rand() 在 -50.0 和 50.0 范围内生成随机浮点数。我到处寻找答案,但它处理整数和 % 运算符。

【问题讨论】:

标签: c++ random range


【解决方案1】:

试试这个:

float RandomNumber(float Min, float Max)
{
    return ((float(rand()) / float(RAND_MAX)) * (Max - Min)) + Min;
}

【讨论】:

    【解决方案2】:

    试试这个:

    1. rand() 给你一个介于 0 和 RAND_MAX 之间的数字
    2. 所以除以RAND_MAX 得到一个介于 0 和 1 之间的数字
    3. 你想要一个从 -50 到 50 的 100 范围,所以乘以 100.0
    4. 最后通过减去 50.0 将中心从 50(每个点 3 在 0 到 100 之间)移动到零

    【讨论】:

      【解决方案3】:
      ((float)rand())/RAND_MAX * 100.0 - 50.0
      

      【讨论】:

        【解决方案4】:

        老实说,所有目前的答案都没有解释他们的解决方案的分布发生了变化(我假设 rand() 遵循均匀分布!如果我错了,请纠正我)。请使用库,我的建议是使用 C++0x 中的新工具:

        #include <random>
        #include <functional>
        
        int main()
        {
            std::mt19937 generator;
            std::uniform_real_distribution<float> uniform_distribution(-50.0, 50.0);
            auto my_rand = std::bind(uniform_distribution, generator);
        }
        

        如果您不能,Boost 是一个完美的选择。这样,您就可以像使用良好的 rand() 一样使用 my_rand():

        std::vector<float> random_numbers(1000);
        std::generate(random_numbers.begin(), random_numbers.end(), my_rand);
        

        【讨论】:

        • 问题说他需要专门使用rand。但是,是的,我同意;如果分发真的很重要,那么 boost 似乎是一个不错的选择。
        • @Max:更准确地说,问题是“尝试...使用 rand()”; OP 从未说过这是一个要求
        • @Jefromi 好点。我一定比平时更缺乏睡眠。 :P
        猜你喜欢
        • 2016-09-25
        • 1970-01-01
        • 1970-01-01
        • 2017-03-09
        • 2013-12-20
        • 2014-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多