rand() 介于 0 和 1 之间

新手上路,请多包涵

所以下面的代码使 0 < r < 1

 r = ((double) rand() / (RAND_MAX))

为什么 r = ((double) rand() / (RAND_MAX + 1)) 会使 -1 < r < 0?

不应该向 RAND_MAX 添加 1 < r < 2 吗?

编辑:我收到警告:表达式中的整数溢出

在那条线上,所以这可能是问题所在。我刚刚做了 cout << r << endl 它肯定给了我介于-1和0之间的值

原文由 CyberShot 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 961
2 个回答

这完全是 特定于实现 的,但似乎在您正在使用的 C++ 环境中, RAND_MAX 等于 INT_MAX

因此, RAND_MAX + 1 表现出未定义(溢出)行为,并变为 INT_MIN 。虽然您的初始语句正在划分(0 和 INT_MAX 之间的随机 #)/( INT_MAX )并生成一个值 0 <= r < 1 ,(现在和 INT_MAX )/( INT_MIN ),生成一个值 -1 < r <= 0

为了生成一个随机数 1 <= r < 2 ,你会想要

r = ((double) rand() / (RAND_MAX)) + 1

原文由 Sam DeHaan 发布,翻译遵循 CC BY-SA 3.0 许可协议

rand() / double(RAND_MAX) 生成一个介于0(含)和1( )之间的浮点随机数,但这不是一个好方法,原因如下(因为RAND_MAX通常为32767):

  1. 可以生成的不同随机数的个数太少了:32768。如果需要更多不同的随机数,需要不同的方式(下面给出代码示例)
  2. 生成的数字太粗粒度:你可以得到 1/32768、2/32768、3/32768,但不能介于两者之间。
  3. 随机数生成引擎的有限状态:在生成 RAND_MAX 随机数后,实现通常开始重复相同的随机数序列。

由于 rand() 的上述限制,生成 0(包括)和 1( 包括)之间的随机数的更好选择是以下片段(类似于 http://en.cppreference.com/w 上的示例 /cpp/numeric/random/uniform_real_distribution ):

 #include <iostream>
#include <random>
#include <chrono>

int main()
{
    std::mt19937_64 rng;
    // initialize the random number generator with time-dependent seed
    uint64_t timeSeed = std::chrono::high_resolution_clock::now().time_since_epoch().count();
    std::seed_seq ss{uint32_t(timeSeed & 0xffffffff), uint32_t(timeSeed>>32)};
    rng.seed(ss);
    // initialize a uniform distribution between 0 and 1
    std::uniform_real_distribution<double> unif(0, 1);
    // ready to generate random numbers
    const int nSimulations = 10;
    for (int i = 0; i < nSimulations; i++)
    {
        double currentRandomNumber = unif(rng);
        std::cout << currentRandomNumber << std::endl;
    }
    return 0;
}

通过将 unif(0, 1) 替换为 unif(1, 2) ,这很容易修改为生成 1(包括)和 2(不包括)之间的随机数。

原文由 Serge Rogatch 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题