使用Rand()为矩阵分配随机值时出现重复坐标问题排查
问题描述
我有一个可生成红、绿两种圆形的类,将这些圆形存储在一个x×2的矩阵中(2x为圆形总数),尝试为每个圆形分配随机X、Y坐标。但运行程序时,几乎每个红色圆形和绿色圆形都堆叠在同一坐标上,不使用矩阵则无此问题。
相关代码
矩阵初始化与循环逻辑
Particle Green[10][2]; for (int i = 0; i < 2; i++) { for (int j = 0; j < Greencount/2; j++) { std::cout << Green[i][j].X << ", " << Green[i][j].Y << std::endl; if (i == 0) { Green[i][j].color = sf::Color(0, 255, 0); } else if (i == 1) { Green[i][j].color = sf::Color(255, 0, 0); } std::cout << i << ", " << j << std::endl; Green[i][j].init(memory);
随机坐标分配代码(init方法内)
float X = rand() % WinX, Y = rand() % WinY;
坐标输出结果
41, 467 0, 0 334, 500 0, 1 169, 724 0, 2 478, 358 0, 3 962, 464 0, 4 705, 145 0, 5 281, 827 0, 6 961, 491 0, 7 995, 942 0, 8 827, 436 0, 9 169, 724 1, 0 478, 358 1, 1 962, 464 1, 2 705, 145 1, 3 281, 827 1, 4 961, 491 1, 5 995, 942 1, 6 827, 436 1, 7 391, 604 1, 8 902, 153 1, 9
问题原因与解决办法
核心原因
init方法未正确赋值成员变量:你在init里定义了局部变量X和Y,生成随机值后没有将其赋值给粒子对象的成员变量X、Y,导致对象的坐标始终是未初始化的内存垃圾值。矩阵中同一列j的两个对象(绿色i=0、红色i=1)的垃圾值大概率相同,因此出现堆叠。- 打印顺序错误:代码中先打印坐标再调用
init,导致你看到的是初始化前的垃圾值,而非实际使用的随机坐标,容易造成误解。
解决步骤
- 修正
init方法的赋值逻辑:将局部变量改为直接给成员变量赋值,比如:// 去掉float声明,直接赋值给对象的成员变量 X = rand() % WinX; Y = rand() % WinY; // 或者明确指定this指针 this->X = rand() % WinX; this->Y = rand() % WinY; - 调整打印顺序:先调用
init初始化坐标,再打印,这样才能看到实际的随机坐标值:Green[i][j].init(memory); std::cout << Green[i][j].X << ", " << Green[i][j].Y << std::endl; - 可选:设置随机种子:为了让每次运行生成的随机序列不同,在程序开头添加:
#include <ctime> // ... srand(time(nullptr));
内容的提问来源于stack exchange,提问作者user23304450
相关产品推荐
相关产品推荐

