You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

问题原因与解决办法

核心原因

  1. init方法未正确赋值成员变量:你在init里定义了局部变量X和Y,生成随机值后没有将其赋值给粒子对象的成员变量X、Y,导致对象的坐标始终是未初始化的内存垃圾值。矩阵中同一列j的两个对象(绿色i=0、红色i=1)的垃圾值大概率相同,因此出现堆叠。
  2. 打印顺序错误:代码中先打印坐标再调用init,导致你看到的是初始化前的垃圾值,而非实际使用的随机坐标,容易造成误解。

解决步骤

  1. 修正init方法的赋值逻辑:将局部变量改为直接给成员变量赋值,比如:
    // 去掉float声明,直接赋值给对象的成员变量
    X = rand() % WinX;
    Y = rand() % WinY;
    // 或者明确指定this指针
    this->X = rand() % WinX;
    this->Y = rand() % WinY;
    
  2. 调整打印顺序:先调用init初始化坐标,再打印,这样才能看到实际的随机坐标值:
    Green[i][j].init(memory);
    std::cout << Green[i][j].X << ", " << Green[i][j].Y << std::endl;
    
  3. 可选:设置随机种子:为了让每次运行生成的随机序列不同,在程序开头添加:
    #include <ctime>
    // ...
    srand(time(nullptr));
    

内容的提问来源于stack exchange,提问作者user23304450

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 16:42:04