使用1D阵列的排列填充1D阵列

时间:2013-05-08 22:00:58

标签: c random

我的目标是创建一个二维数组,使用一维数组的随机排列来填充。不应填写tab的第一行和第一列。这是我到目前为止所尝试的,但这不起作用:

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

#define S 5

void make_board(char tab[S][S]){
    int i;
    int j;
    char signs[16] = {'Z', 'Z', 'Y','Y','X','X','W','W','U', 'U', 'V', 'V', 'S', 'S', 'T', 'T'};

    srand(time(NULL));

    for(i = 0; i < 16; i++){
        int r = ( rand() % 16 );
        int rx = ( rand() % 4 ) + 1;
        int ry = ( rand() % 4 ) + 1;
        tab[rx][ry] = signs[r];
    }
}

2 个答案:

答案 0 :(得分:0)

也许您应该在signs[r]中使用r代替tab[rx][ry] = r;

答案 1 :(得分:0)

对于排列,char中的每个signs都放在tab中的唯一位置,您需要做更多的工作。

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

#define S 5
#define C 16

int main()
{
    char signs[C] = {'Z', 'Z', 'Y', 'Y', 'X', 'X', 'W', 'W', 'U', 'U', 'V', 'V', 'S', 'S', 'T', 'T'};
    char tab[S][S];

    srand(time(NULL));

    // generate the random permutation
    size_t perm[C];
    for (int i = 0; i < C; i++)
        perm[i] = i;

    for (int i = 0; i < C; i++)
    {
        int j = rand() % C;
        char tmp = signs[j];
        signs[j] = signs[i];
        signs[i] = tmp;
    }

    // copy the chars to tab
    int k = 0;
    for (int i = 1; i < S; i++)
    {
        for (int j = 1; j < S; j++)
        {
            tab[i][j] = signs[perm[k++]];
            printf("%c", tab[i][j]);
        }
        printf("\n");
    }

    return 0;
}