【问题标题】:c++ rand() modulo floating point numbers [duplicate]c ++ rand()模浮点数[重复]
【发布时间】:2013-09-13 14:12:42
【问题描述】:

在 c++ 中,我希望得到一个随机浮点数。据我所知,典型的随机数生成是通过以下方式完成的:

rand() % 100 

这将为您提供 0 到 99 之间的值

  1. 我想要的是rand() % PI / 12

解释是0到PI/12之间的随机角度

提前致谢!

【问题讨论】:

标签: c++ random floating-point modulo


【解决方案1】:

使用 C++11 <random> 解决方案可能如下所示:

#include <random>
#include <iostream>

int main()
{
    const int length = 60;
    std::random_device rd;
    std::mt19937_64 mt(rd());
    std::uniform_real_distribution<double> distribution(0, M_PI/12);
    for(int i = 0; i < length; i++)
    {
        double d = distribution(mt);
    std::cout << "d = " << d << std::endl;
    }
}

【讨论】:

  • 如何获得c++11?我正在使用 g++ 4.6.3
  • 获取支持的编译器。这编译并似乎可以使用-std=c++0x 与 g++ 4.6.3 一起使用。
【解决方案2】:

你想做的是这样的:

double RealRand (double up_to)
{
    return double(rand()) / RAND_MAX * up_to;
}

实际上,它的作用是首先生成一个介于 0 和 1(包括左端)之间的随机数,然后将该数字缩放为 [0..up_to]。 (注意:如果你不知道,rand() 函数会生成 0 到 RAND_MAX 之间的随机整数。)

但是,您不想这样做有(至少)两个原因。首先,rand() 通常是一个糟糕的随机数生成器。其次,在某些平台上(例如 Visual C++)RAND_MAX 是一个非常小的数字(32767 之类的),这会导致生成的实际值的分辨率很差。

强烈建议使用 &lt;random&gt; 标头(较新的 C++)中的工具。

【讨论】:

    猜你喜欢
    • 2012-10-27
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 2012-01-20
    • 2021-09-16
    相关资源
    最近更新 更多