rand()介于0和1之间

rand() between 0 and 1

本文关键字:之间 介于 rand      更新时间:2023-10-16

因此以下代码使0<r<1

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

为什么具有CCD_ 1使得-1<r<0?

不应该给RAND_MAX加一使1<r<2.

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

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

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

因此,RAND_MAX + 1表现出未定义的(溢出)行为,并变为INT_MIN。当您最初的语句是对(0和INT_MAX之间的随机数)/(INT_MAX)进行除法运算并生成值0 <= r < 1时,现在它对(0到r = ((double) rand() / (RAND_MAX + 1))0之间的随机号)/(INT_MIN)进行除法,生成值-1 < r <= 0

为了生成随机数1 <= r < 2,您需要

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

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

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

由于rand()的上述限制,生成0(包括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(1, 2)替换unif(0, 1),这很容易修改为生成1(包括1)和2(不包括2)之间的随机数。

否,因为RAND_MAX通常扩展为MAX_INT。因此,添加一个(显然)会使其处于MIN_INT(尽管正如我所知,它应该是未定义的行为),因此符号.发生了反转

要得到你想要的,你需要将+1移动到计算之外:

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

没有。它是0 <= r < 1,但你原来的是0 <= r <= 1

请注意,如果RAND_MAX + 1溢出,这可能会导致未定义的行为

这是正确的方法:

double randd() {
  return (double)rand() / ((double)RAND_MAX + 1);
}

double randd() {
  return (double)rand() / (RAND_MAX + 1.0);
}

我的猜测是RAND_MAX等于INT_MAX,因此您将其溢出为负数。

只需这样做:

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

或者更好的是,使用C++11的随机数生成器。

this->value = rand() % (this->max + 1);

在0和1++之间似乎工作正常。