所以下面的代码使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之间的值
所以下面的代码使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之间的值
r
是在零到范围内的随机数m
,则比率r/m
将在范围内(0,1)
,但r/(m+1)
将在(0, m/(m+1))
非范围内(1,2)
。如果m
非常大(与1相比),则m/(m+1)
大约为1,因此您的表达式r = ((double) rand() / (RAND_MAX + 1))
将给出大约在(0,1)范围内的随机数-也就是说,如果没有溢出。
Answers:
这完全是特定于实现的,但是似乎在您使用的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_MAX
?
1.0
,而不是1,这将迫使RAND_MAX
对double
类型等避免整数溢出。
rand() / double(RAND_MAX)
生成介于0(包括)和1(包括)之间的浮点随机数,但是由于以下原因,这不是一个好方法(因为RAND_MAX通常为32767):
由于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)
,可以很容易地对其进行修改以生成介于1(含)和2(不含)之间的随机数unif(1, 2)
。
random_device
所有可能的方法,但是得到了相同的输出。我不知道0xfffffffff是什么(十六进制代码?),右移到32 ...两者都在我头上。(我刚接触C ++,但是它比Rust,恕我直言要容易得多。)谢谢!
不可以,因为RAND_MAX通常扩展为MAX_INT。因此,添加一个(显然)将其放在MIN_INT位置(尽管据我所知,这应该是未定义的行为),因此符号反转了。
要获得所需的内容,您需要将+1移动到计算之外:
r = ((double) rand() / (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 ;
}
}
1
在最后一个之后添加)