数组中的随机化不一致

时间:2013-07-05 21:16:19

标签: c++ arrays random

基本上,我有一块6x6的电路板。我创建了一个函数,它应该在板上的随机坐标上放置三个X.

const int size = 6;

char board[6][6] = {0};  //this is actually somewhere else, but I included it here for clarity

char enemies[3] = {'X','X','X'};

void setup(char board[6][6]){

bool valid = false;  //sets initial bool value to false

for (int x = 0; x <= 2; ++x){
    do{
    int a = rand() % size;
    int b = rand() % size;
    if (board[a][b] == 0){
    board[a][b] = enemies[x];
    valid = true;      
        }
    }while(!valid);  //if the value is false, redo until an empty board space is found 
}

(我在主函数中也包括了srand(time(NULL))

它有效,但有时只有。有时它产生3个随机放置的X,有时只有2.我希望它每次生成3个。我已经超过了它一百万次,尝试微小的变化和修正,但我似乎无法弄清楚什么是错的。如果电路板是空白的(电路板[a] [b] == 0),我在其中包含了一个条件,它只能放置敌人[x],但由于某种原因它有时只放置2个X.

3 个答案:

答案 0 :(得分:0)

放置第一个X后,validfor循环的所有后续迭代都保持为真,即使找不到有效的正方形。

我将迭代变量更改为i(当使用2d坐标时,使用x表示除了序数以外的其他内容只是令人困惑),并修复了内部重试循环:

for (int i = 0; i <= 2; ++i) {
    // loop until we find a valid coordinate
    while(true) {
        int a = rand() % size; 
        int b = rand() % size;
        if (board[a][b] == 0){
            board[a][b] = enemies[i];
            break; // we found one!
        }                                   
    } 
}

答案 1 :(得分:0)

您没有重置外部循环中的valid标志。所以,一旦你放置了第一块,就不能正确处理重复。

for (int x = 0; x <= 2; ++x)
{
    valid = false;         // <-- you forgot to do this.
    do
    {
        int a = rand() % size;
        int b = rand() % size;
        if (board[a][b] == 0)
        {
            board[a][b] = enemies[x];
            valid = true;      
        }
    } while(!valid);
}

答案 2 :(得分:0)

每次运行do / while循环后,您需要重置valid。在第一次迭代之后(x为0时),valid将设置为true。您永远不会将其重置为false,等等下一次迭代(从x开始为1),valid将被设置为true。这意味着您可以选择已标记的随机坐标,然后继续进行下一个x

这意味着完全有可能只会标记一个方格,但这种情况的可能性很低(如果我的数学是正确的,则在1,225中为1)。