C++如何将符合对数正态分布的矩阵数据写入CSV文件
问题原因
你当前的代码在输出每行数据时,仅输出了行号和1个随机数值就直接换行,没有为剩余的49列生成对应数值,因此其余列全部为空。
修改要点
- 补全缺失的头文件:原代码中使用
std::setw、std::setfill需要引入<iomanip>,字符串流需要引入<sstream>(你误写为<stream>) - 新增内层循环:每行输出行号后,循环遍历所有列,为每一列生成对应的对数正态分布数值后再换行
- 可选优化:控制浮点数输出精度,匹配你示例中的6位小数格式
修改后的完整代码
#include <iostream> #include <vector> #include <random> #include <fstream> #include <sstream> #include <iomanip> // 定义常量方便后续调整 const int COL_NUM = 50; // 总列数(S开头的列数) const int ROW_NUM = 1000; // 总行数 const int PRECISION = 6; // 浮点数输出精度 std::string GetNextNumber(int lastNum) { std::stringstream ss; ss << "S"; ss << std::setfill('0') << std::setw(4) << lastNum; return ss.str(); } int main() { std::default_random_engine generator; std::lognormal_distribution<double> distribution(0.0,1.0); std::ofstream outFile("Data_bid.csv"); // 设置浮点数输出精度 outFile << std::fixed << std::setprecision(PRECISION); // 输出表头 outFile << ""; // 第一列表头为空,对应你示例里第一个单元格的位置 for(int j=0; j<COL_NUM; ++j){ outFile << "," << GetNextNumber(j+1); } outFile << std::endl; // 输出每行数据 for(int i=0; i<ROW_NUM; ++i){ // 输出第一列的行号 outFile << i; // 循环输出每一列的随机数值 for(int j=0; j<COL_NUM; ++j){ double bid = distribution(generator) + 10; outFile << "," << bid; } // 写完所有列再换行 outFile << std::endl; } outFile.close(); return 0; }
其他说明
如果需要实现你示例中部分单元格为空的效果,只需要在内层循环中加判断逻辑,符合条件时不输出数值(直接输出,即可)。
内容的提问来源于stack exchange,提问作者Cyan
相关产品推荐
相关产品推荐

