【问题标题】:Store random number in 2d array将随机数存储在二维数组中
【发布时间】:2016-05-26 10:38:35
【问题描述】:

我将一些随机数存储到二维数组中,但有些数字似乎在边/边框上。我不确定它有什么问题。我想要的是将所有随机数放在二维数组的边界内。

#include <stdio.h>
#include <stdlib.h>

#define ROW 9
#define COL 9


void gameboard(char box[ROW][COL])
{
    int x,y;

    for(x = 0; x < ROW; x++)
    {
        for(y = 0; y  <COL; y++)
        {
            box[x][y] =' '; 
        }   
    }
    for(x = 0; x < ROW; x++)
    {
        box[0][x]='#';
        box[x][8]='#';

        box[x][0]='#';
        box[8][x]='#';   
    }    
 }


void rnum(char box[ROW][COL])
{
     int x,r1,r2,r3,r4;
     char r='1';
     srand( (unsigned) time(NULL)); 

     for(x=0;x<9;x++)
     { 
        r1 =  rand()%9;
        r2 =  rand()%9;
        r3 =  rand()%9;
        r4 =  rand()%9;

        box[r1][r2]= r + x;
        box[r3][r4]= r + x;
     }     
}


int main(void)
{
    char box[ROW][COL];
    char name[20];
    int x,y,choice;

    gameboard(box);

    rnum(box);     

    for(x = 0; x < ROW; x++)
    {
        for(y = 0; y  < COL; y++)
        {
         printf(" %c ",box[x][y]);
        }
        printf("\n\n");
    }

    rnum(box);

    return 0;
}

这是输出:

【问题讨论】:

  • 注意边界。不应覆盖任何元素 08,因为 # 符号已经存在。这是 rnum() 中的 for 循环: ` for(x=0;x
  • 太棒了!有用 !谢谢。

标签: c


【解决方案1】:

如果您需要将随机数保持在 1-9 之间,您可以使用以下函数。但是我不知道你需要多少个随机数来填充这个块,所以我把它留给你。

    void rnum(char box[ROW][COL]) {
      int x,r1,r2,r3,r4;
      char r='1';
      srand( (unsigned) time(NULL));
      int iter = 9;
      x = 0;
      while (iter != 0) {
        r1 =  rand()%9;
        r2 =  rand()%9;
        r3 =  rand()%9;
        r4 =  rand()%9;
        if (r1 == 0 || r2 == 0 || r1 == 8 || r2 == 8 ||
            r3 == 0 || r4 == 0 || r3 == 8 || r4 == 8)
          continue;
        else {
          box[r1][r2]= r + x;
          box[r3][r4]= r + x;
          iter--;
        }
        x++;
     }
  }

【讨论】:

    【解决方案2】:

    我认为关键在这里:

     for(x=0;x<9;x++)
     {
         r1 =  rand()%9;
         r2 =  rand()%9;
         r3 =  rand()%9;
         r4 =  rand()%9;
    
         box[r1][r2]= r + x;
         box[r3][r4]= r + x;
      } 
    

    因为 r1,r2,r3,r4 是随机数,并且包含了边框的坐标。所以数字出现在侧面/边框上是正常的。

    【讨论】:

      【解决方案3】:

      注意边界。不应覆盖任何元素 [0][7],因为 # 字符已经存在。计数器也应该绝不超过数组边界。这是rnum()中的for loop

      for( x=0; x<7; x++) { 
          r1 = 1 + rand()%7; //always between 1 and 6 !
          r2 = 1 + rand()%7; 
          r3 = 1 + rand()%7; 
          r4 = 1 + rand()%7; 
          box[r1][r2] = r + x; 
          box[r3][r4] = r + x; 
          } 
      

      【讨论】:

        【解决方案4】:

        rand() % 9 将返回一个介于 08 之间的数字。但是您的数组的边框占用索引08

        为避免覆盖它,请在17 之间选择一个随机数:

        r1 = 1 + rand() % 7;
        

        请注意,缩放rand() 的输出(除以RAND_MAX + 1 然后乘以您的上限)比使用余数具有更少的偏差,但在您的情况下它可能并不重要。

        【讨论】:

        • 我改了,结果还是一样。
        【解决方案5】:

        你可以试试下面的代码:

        #include <stdio.h>
        #include <stdlib.h>
        
        #define ROW 9
        #define COL 9
        
        void gameboard(char box[ROW][COL]) {
            int x,y;
            for(x = 0; x < ROW; x++) {
                for(y = 0; y  <COL; y++) {
                    box[x][y] =' '; 
                }
            }
        }
        
        void rnum(char box[ROW][COL]) {
            int x,r1,r2,r3,r4;
            char r='1';
            srand( (unsigned) time(NULL)); 
        
            for(x=0;x<9;x++) {
                r1 =  rand()%9;
                r2 =  rand()%9;
                r3 =  rand()%9;
                r4 =  rand()%9;
        
                box[r1][r2]= r + x;
                box[r3][r4]= r + x;
            } 
        
            for(x = 0; x < ROW; x++) {
                box[0][x]='#';
                box[x][8]='#';
        
                box[x][0]='#';
                box[8][x]='#';
            }
        }
        
        int main(void) {
            char box[ROW][COL];
            char name[20];
            int x,y,choice;
        
            gameboard(box);
        
            rnum(box);     
        
            for(x = 0; x < ROW; x++) {
                for(y = 0; y  < COL; y++) {
                    printf(" %c ",box[x][y]);
                }
                printf("\n\n");
            }
        
            rnum(box);
        
            return 0;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多