【问题标题】:Inconsistent randomization in array数组中的随机化不一致
【发布时间】:2013-07-05 21:16:18
【问题描述】:

基本上,我有一个 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 个。我已经经历了一百万次,尝试了细微的变化和更正,但我似乎无法弄清楚哪里出了问题。我加入了一个条件,它只在棋​​盘为空白时放置敌人 [x](棋盘 [a][b] == 0),但有时由于某种原因它只放置 2 个 X。

【问题讨论】:

  • 为了识别问题,您应该在调试器中逐行执行此操作,密切注意所有变量的值。

标签: c++ arrays random


【解决方案1】:

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

我将迭代变量更改为 i(使用 x 来表示在使用 2d 坐标时表示序数以外的东西只会令人困惑),并修复了您的内部重试循环:

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!
        }                                   
    } 
}

【讨论】:

  • 感谢大家的回答。
【解决方案2】:

您没有在外循环内重置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);
}

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-12
      • 2021-07-17
      • 2023-03-26
      • 2013-11-13
      • 2017-06-27
      • 2017-08-31
      相关资源
      最近更新 更多