2

所以问题是开发一个 [5][5] 表,每个表都包含 1-100 的唯一数字(没有重复

所以这就是我想出的:

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

int main()
{
    int outerLoop;
    int innerLoop;

    int board[5][5]; /* Array Name And Size*/

/* seeds the random number generator*/

srand(time(NULL));

int number;

number = rand() % 101;

/* Start a loop to generate a random integer between 1 and 100 and 
assign it into the array. The loop runs 25 times*/

for (  outerLoop = 0  ;  outerLoop <= 25  ; outerLoop++ ) /* loop 25 times*/
{
    for (  innerLoop = 0  ;  innerLoop <= 4  ; innerLoop++   ) /* <=4 due to 5
columns*/
    {
        board[outerLoop][innerLoop] = rand() % 100 + 1;
    }
    printf( "%d \n", board[outerLoop][innerLoop] );
}

所以我几乎被困在这里。我不太确定:

board[outerLoop][innerLoop] = rand() % 100 + 1;

我只是编造的:/有什么想法吗?

4

6 回答 6

6

你想要的是一个洗牌算法

C中的随机数组

从 1 到 100 获得 25 个元素的唯一 #s 数组;只需创建一个包含数字 1..100 的 100 元素数组,将第一个 25 从 100 池中洗牌,然后使用第一个 25。

$ cat test.c
    #include <stdio.h>
    #include <stdlib.h>

    void shuffle(int *array, size_t array_size, size_t shuff_size)
    {   
        if (array_size > 1)  
        {   
            size_t i;
            for (i = 0; i < shuff_size - 1; i++) 
            {   
              size_t j = i + rand() / (RAND_MAX / (array_size - i) + 1); 
              int t = array[j];
              array[j] = array[i];
              array[i] = t;
            }   
        }   
    }   

  int main(int argc, char * argv[]) {
        int a[100];
        int b[5][5];
        int i,j,k=0;

        for(i=0; i<100;++i)
            a[i]=i;

        shuffle(a,100,25);

        for(i=0;i<5;++i)
            for(j=0;j<5;++j) {
                b[i][j] = a[k++];
                printf("%d ",b[i][j]);
        }
        printf("\n");
    }   

$ gcc -o test test.c

$ ./test
0 14 76 47 55 25 10 70 7 94 44 57 85 16 18 60 72 17 49 24 53 75 67 9 19 
于 2013-10-14T15:08:11.053 回答
1

把它想象成一副 100 张卡片。

  • 创建一个包含卡号的 100 元素数组 (1..100)
  • 洗牌阵列(=甲板)。(见@koodawg 的回答和@Steve314 的评论)
  • 将牌组中的前 25 张牌“发给”自己,放入 5x5 阵列中。
于 2013-10-14T15:17:41.653 回答
0

这里有一些伪代码来解决它:

  • 创建一个长度为 100 的“列表”,其中包含名为“numbersAvailable”的数字 1...100
  • 在您的内部循环集中index = (int)rand() * numbersAvailable;并获取数字numbersAvailable.get(index);然后执行numbersAvailable.remove(index);

在 Java 中创建列表很容易。如果您想坚持使用 C,则必须通过数组来模拟它。(我可以写下解决方案,但这看起来像一个家庭作业,所以我给你留点东西)。

注意:与试验和拒绝解决方案相比,此解决方案的优点是构建结果所需的时间固定。

于 2013-10-14T14:15:09.990 回答
0

由于int board[5][5];分配了连续的内存量,因此您可以使用它来初始化它

for (i = 0; i < sizeof(board)/sizeof(int); i++)
    board[0][i] = rand() % 100 + 1;

或者像你一样使用双循环,但是你只需要在另一个循环中循环 5 次,或者使用sizeof自动设置迭代计数:

for (  outerLoop = 0  ;  outerLoop < sizeof(board)/sizeof(board[0])  ; outerLoop++ ) {
    for (  innerLoop = 0  ;  innerLoop < sizeof(board[0])/sizeof(board[0][0])  ; innerLoop++   ) {
        board[outerLoop][innerLoop] = rand() % 100 + 1;
    }
}

请记住,sizeof只有在编译时已知数组的长度时,才会以这种方式在数组上工作,就像在您的示例中一样。

于 2013-10-14T14:47:15.987 回答
0

C stores arrays in row-major order, i.e, the elements of row 0 comes first , followed by the elements of row 1, and so forth.

enter image description here
We can take advantage of this by viewing int board[5][5] as int board[5*5].

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 5

int main()
{
    int i, outerLoop = 1;
    int board[N*N];

    srand(time(NULL));

    int number;
    board[0] = rand() % 100 + 1; //initializing the first element

    while(1)
    {
            number = rand() % 100 + 1 ;

            if(outerLoop == N*N)
                break;      
            else
            {
                //Cheking the previous elements for no duplicacy
                for ( i = 0; i < outerLoop; i++)
                {
                    if(number == board[i])
                        break;
                }

                //confirming whether all the elements are checked or not and the assigning number to the array element and then increment the counter outerLoop 
                if(i == outerLoop)
                {
                    board[outerLoop] = number;
                    outerLoop++;
                }
                else
                    continue;
            }

    }

    //Printing the elements of array board[N*N]
    for (  outerLoop = 0  ;  outerLoop < N*N  ; outerLoop++ )
    {
        printf( "%d\t", board[outerLoop] );
        if(outerLoop % N == 4)
            printf("\n\n");
    }

}
于 2013-10-14T17:15:33.743 回答
0

只需创建大小为 100 的布尔数组:bool numberUsed[100]。然后在循环中:

1.Generate random number r
2.If numberUsed[r] is true, dont add that r anywhere and continue in loop
3.numberUsed[r] = true

请注意,您需要在这种方法中使用 WHILE 循环,而不是 FOR 循环。

于 2013-10-14T14:11:48.510 回答