将随机元素分配给结构域

时间:2016-02-11 19:06:33

标签: c function

我正在尝试编写一个必须随机将一些元素分配给结构的函数。这是我试图做的事情:

void assignTerrains (Player* g, Terrain* c, int n){
int i, j, nRand, terrains_for_player;

terrains_for_player = NTERRAINS / n; 

for (i=0; i<n; i++){
    for(j=0; j<terrains_for_players; )
        do {
            nRand = minRand + rand()%(maxRand - minRand + 1);
        } while (c[nRand].boxType != Terrain);

        c[nRand].idProp = i;
        g[i].capital -= c[nRand].cost;
        g[i].numTerrains++;
        j++
    }
}

terrains_for_players是每个玩家将获得的地形数量。地形数量为40,但其中只有24个是可分配的类型(boxType必须是地形)。例如:5个玩家,所以它将是24/5,前四个玩家每个将有5个地形,而最后一个将有4个。地形必须平均分配给每个玩家,并且必须是随机的。所以我生成一个随机数,直到nRand索引处的c为“terrain”类型,然后我做我必须做的操作(从玩家减去钱,并增加他们拥有的地形数量。希望有人可以帮助我!谢谢。

1 个答案:

答案 0 :(得分:1)

  1. 你的代码很难看(抱歉这么直接)。使用有意义的变量名并正确缩进。

  2. 造成这个问题的原因(我想,你不是说你期待的是什么以及你实际得到的结果)就在这里:

    do {
        nRand = minRand + rand()%(maxRand - minRand + 1);
    } while (c[nRand].boxType != Terrain);
    c[nRand].idProp = i;
    

    在该循环中,您尝试找到具有正确类型的随机地形,但是您忘记检查您可能找到的地形可能已被其他玩家使用(之前的外环迭代)。将条件改为...... ...

    do {
        nRand = minRand + rand()%(maxRand - minRand + 1);
    } while ((c[nRand].boxType != Terrain) && (c[nRand].idProp != NO_PLAYER));
    c[nRand].idProp = i;
    

    ......应该解决这个问题。

  3. 更好的方式是IMO首先生成可用地形的随机排列,然后让每个玩家选择合适数量的这些。像:

    Terrain * suitableTerrains = getThat24SuitableTerrains();
    permuteRandom(suitableTerrains); // Using random swapping, choosing random indicies, what ever
    size_t nextTerrain = 0;
    for (player = 0; player < countPlayers; ++player) {
      unsigned terrain;
      for (terrain = 0; terrain < terrainsPerPlayer; ++terrain) {
        // assign suitableTerrains[nextTerrain] to the player
        ++nextTerrain;
      }
    }