随机的双重问题
Random Double Issues
我在生成随机双位数时遇到了一些麻烦。我必须创建一个函数,它不接受任何参数,并返回一个双精度(0到100之间),一个随机数。每次我尝试创建它时,它都会返回一个值1。
我还必须使用一些符号常量。
#include <iostream>
#include <iomanip>
#include <ctime>
#include <cstdlib>
double randDouble();
const double UPPER_BOUND = 100.0;
const double LOWER_BOUND = 0.0;
const int ARRAY_SIZE = 100;
double randDouble()
{
int randomInt;
double randomDouble;
srand(time(NULL));
randomInt = rand() % 100 + 1;
randomDouble = LOWER_BOUND + (randomInt / RAND_MAX / ( UPPER_BOUND - LOWER_BOUND));
return randomDouble;
}
int main()
{
cout << randDouble();
return 0;
}
另一件事是,我必须使用一个预先给定的公式。
lower bound + ( random integer / (maximum possible random number / (upper bound - lower bound))
首先,您没有在main
中调用randDouble
,而是尝试打印函数本身。这将始终打印1
或true
,具体取决于是否设置了boolalpha
。如果启用了更激进的警告级别,编译器就会警告您。一般建议这样做。
修正后,您会注意到总是得到0。这是因为randomInt / RAND_MAX
总是零,因为截断整数除法。
当你修复这个问题时,你会注意到返回的值不是你想要的,因为你的公式是不正确的。
使用现代的std::uniform_real_distribution
可以避免很多这样的问题,它已经为你做了所有的艰苦工作。
你可以用一种更好、更简洁的方式来做:
#include<random>
#include<iostream>
using namespace std;
int main(){
std::random_device rand_dev;
std::mt19937 gen(rand_dev());
std::uniform_real_distribution<double> dist(0, 100);
// demo.
for(int i = 0; i < 100; ++i){
// call dist(gen) whenever you need a random variable.
cout << dist(gen) << 'n';
}
return 0;
}
此代码使用c++ 11,不能在早期版本上运行。
相关文章:
- 在类中使用随机生成器时出现性能问题
- 代码输出随机符号,我不确定出了什么问题
- 这个随机字符串打印代码有什么问题?
- 我在理解 AVX 随机内部函数如何为 8 位时遇到一些问题
- C++ 制作一个随机数字/字母生成器,代码中有问题
- C++ 随机套牌问题
- 生成随机学生数学问题
- 随机化问题
- 再次随机化的问题
- 按行、列或随机从数组填充矩阵时出现错误索引问题
- 随机树CvRTrees持久性问题opencv
- 在C++中使用std::ofstream创建具有随机文件名的文件时出现问题
- 使用快速英特尔随机生成器(SSE2)会因堆栈问题而失败..已损坏
- 如何随机排列数组问题
- 使用梅森捻线机随机双生成的性能问题
- 随机化不会在 while 循环中发生。如何解决这个问题?C++
- 定义的随机问题
- 我在生成两副单独随机的纸牌时遇到问题
- 在matlab上生成有限制的随机向量时出现问题
- 我无法弄清楚这个随机发生器有什么问题