簡體   English   中英

C隨機矩陣,數字在0到9之間

[英]C random matrix with numbers between 0 and 9

我是一個C新手,我正在嘗試制作一個矩陣5x4只有0到9之間的數字,其中每個數字需要在那里2次(我正在嘗試制作記憶游戲)。 我得到了這個代碼,但我認為這是一個混亂,它不起作用,所以我的問題是,我如何改進我的代碼或如何以不同的方式制作這個矩陣?

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

#define MaxC 4
#define MaxL 5



int main(){


    int n1=0, n2=0, n3=0, n4=0, n5=0, n6=0, n7=0, n8=0, n9=0, n0=0;
    int i=0,j=0,r;
    int n[MaxL][MaxC];
    srand(time(NULL));

    while(i<5){
        j=0;
        while(j<4){

            r=(rand()%10);

            if(r==0 && n0<2){
                n0++;
                j++;
                n[i][j]=r;
                printf(" %3d ",n[i][j]);
            }
            if(r==1 && n1<2){
                n1++;
                j++;
                n[i][j]=r;
                printf(" %3d ",n[i][j]);
            }
            if(r==2 && n2<2){
                n2++;
                j++;
                n[i][j]=r;
                printf(" %3d ",n[i][j]);
            }
            if(r==3 && n3<2){
                n3++;
                j++;
                n[i][j]=r;
                printf(" %3d ",n[i][j]);
            }
            if(r==4 && n4<2){
                n4++;
                j++;
                n[i][j]=r;
                printf(" %3d ",n[i][j]);
            }
            if(r==5 && n5<2){
                n5++;
                j++;
                n[i][j]=r;
                printf(" %3d ",n[i][j]);
            }
            if(r==6 && n6<2){
                n6++;
                j++;
                n[i][j]=r;
                printf(" %3d ",n[i][j]);
            }
            if(r==7 && n7<2){
                n7++;
                j++;
                n[i][j]=r;
                printf(" %3d ",n[i][j]);
            }
            if(r==8 && n8<2){
                n8++;
                j++;
                n[i][j]=r;
                printf(" %3d ",n[i][j]);
            }
            if(r==9 && n9<2){
                n9++;
                j++;
                n[i][j]=r;
                printf(" %3d ",n[i][j]);
            }

        }
        i++;
    }
    return 0;
}

這是一個小改動,使您的程序更短。

我把n0,n1,....放到了一個由r索引的數組中。

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

#define MaxC 4
#define MaxL 5

int main()
{
    int na[10] = {0};
    int n[MaxL][MaxC], i=0;
    srand((unsigned)time(NULL));

    while(i<MaxL)
    {
        int j=0;
        while(j<MaxC)
        {
            int r = rand() % 10;
            if(na[r]<2)
            {
                ++na[r];
                n[i][j] = r;
                printf(" %3d ",n[i][j]);
                ++j;
            }
        }
        ++i;
        printf("\n");
    }
    return 0;
}

示例輸出:

   2    6    1    8 
   4    7    0    2 
   5    3    7    8 
   9    1    0    3 
   5    6    4    9 

您的代碼會一直嘗試隨機數,直到您將每個數字兩次。 這不是最好的方法。

相反,您可以在固定位置使用20個數字初始化矩陣,然后對矩陣進行隨機混洗。

首先,你已經在每個if語句中放置了j++ 如果你只是在循環結束時離開j++ ,它看起來會更清晰。 print語句也是如此。

其次,如果您可以發布程序正在打印的內容或描述它是如何工作的,那么這將有助於您獲得問題的答案。 如果不自己嘗試,我看不出你的代碼有什么功能問題。

編輯:有關進一步簡化代碼的方法,請參閱4386427的答案。

我可以幫你嗎? 如果在陣列上替換十個nX變量,則可以簡化代碼。 看這個:

int main(){
    int c[10] = {0};
    int i=0,j=0,r;
    int n[MaxL][MaxC];
    srand(time(NULL));

    for(i = 0; i < 5; i++) {
      for(j = 0; j < 4; j++) {
        do {
           r=(rand()%10);
        } while( c[r] > 2);
        ++c[r];
        n[i][j]=r;
        printf(" %3d ",n[i][j]);
      }
      printf("\n");
    }
    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM