rand()介于0和1之间
rand() between 0 and 1
因此以下代码使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):
- 可以生成的不同随机数的数量太少:32768。如果你需要更多不同的随机数,你需要一种不同的方法(下面给出了一个代码示例)
- 生成的数字粒度太粗:可以得到1/32768、2/32768、3/32768,但不能得到介于两者之间的任何数字
- 随机数生成器引擎的有限状态:在生成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++之间似乎工作正常。
- 介于 1 和 100 之间的质数列表
- 介于 [固定数组] 和 [带内存分配的指针] 之间的性能
- 放大倍率低于 125% 默认 win API(介于 101 - 124% 之间)
- C++ 中介于 0 和 1 之间的随机数
- 创建一个带有限制的数字数据类型,一个介于 -10 和 10 之间的整数
- 如何将数据从顶点着色器传递到介于两者之间的片段着色器
- 有效地介于小型和大型浮标之间
- 生成 0 或 1,而不是介于两者之间
- 本应生成 2 个介于 1 和 9 之间的随机数的程序C++只生成 6 和 9 并且没有正确循环
- 为什么指针减法会导致介于两者之间的元素数量
- 将两个数字替换为给定数组中介于两个之间的单个数字
- 在 C/C++ 中生成介于 2 个限制之间的随机素数
- CPP 运算符 = 介于 2 个类之间
- 介于 2 个值之间的随机数
- 我们应该使用哪种数据类型来输入一个介于 0<= 数字 <= 10^18 之间的数字
- 如何在c++中生成一个介于1和16之间的随机数
- 什么是介于2 int变量之间的mean管道运算符
- C++生成一个介于 0 和 100,000 之间的随机数
- C++ 创建一个介于 0.1 和 10 之间的随机小数
- 如何在 c++ 中生成介于 0 和变量之间的随机双精度