繁体   English   中英

rand() 介于 0 和 1 之间

[英]rand() between 0 and 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 之间的值

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

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

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

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

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;
}

这是很容易通过更换修改来产生随机数介于1(含)和2(不含) unif(0, 1)unif(1, 2)

不,因为RAND_MAX通常会扩展为MAX_INT。 所以添加一个(显然)将它放在MIN_INT(虽然它应该是我所说的未定义的行为),因此符号的反转。

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

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

它没有。 它使0 <= r < 1 ,但原始值为0 <= r <= 1

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

我的猜测是RAND_MAX等于INT_MAX ,所以你把它溢出到负数。

这样做:

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

甚至更好,使用C ++ 11的随机数生成器。

这是正确的方法:

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

要么

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

在我的情况下(我使用VS 2017)工作正常以下简单的代码:

#include "pch.h"
#include <iostream>
#include <stdlib.h>
#include <time.h>

int main()
{
    srand(time(NULL));

    for (int i = 1000; i > 0; i--) //try it thousand times
    {
        int randnum = (double)rand() / ((double)RAND_MAX + 1);
        std::cout << " rnum: " << rand()%2 ;
    }
} 

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM