为每一行添加一些元素的更好方法是什么?

时间:2014-02-25 20:00:10

标签: c arrays

我有一个带零的数组。我想插入一些元素,特别是每行添加2个元素。

我想这样做如下:

假设我有一个3x3的零数组。我使用2d数组作为1d。

如果我记下行主要订单,我有:

index :          0  1  2   3  4  5   6  7  8
elements:        0  0  0 | 0  0  0 | 0  0  0

所以,我正在增加指数i + 2.

所以,我这样做了:

for (int i=0;i<rows;i++){
    for (int j=0;j<col;j++){
        int count=0;
        for (int ind=0;ind<rows*col;ind++){

            A[ind]=(double)(rand()%10+1.);
            count++;

            if (count==2){
                ind+=i+col; 
                count=0;
            }
        }
     }
  }
  1. 有没有更好的方法可以在不使用矢量或类似的情况下执行此操作?

  2. 此外,我现在正在特定位置添加元素。有没有办法在不使用“shuffle”和类似的,或者没有办法的情况下在随机位置添加它们?

3 个答案:

答案 0 :(得分:2)

#include <stdio.h>

int main(){
    int a[3][3] = { 0 };
    int *A = &a[0][0];
    int row, col;
    int i,j;
    row = col = 3;

    for(i = 0; i<row; ++i){
        int pos = rand() % col;
        for(j = 0; j< col ;++j){
            if(j != pos)
                a[i][j] = rand()%10 + 1;
        }
    }
    for(i = 0;i<row*col;++i)
        printf("%d ", A[i]);
    printf("\n");
    return 0;
}

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

void swap(int *a, int *b){
    int temp = *a;
    *a = *b;
    *b = temp;
}

void selectPos(int range, int num, int pos[num]){
    int i, position[range];
    for(i=0;i<range;++i){
        position[i]=i;
    }

    for(i=0;i<num;++i){
        int n = rand()%range;
        pos[i] = position[n];
        swap(&position[--range], &position[n]);
    }
}

int main(){
    int a[3][5] = { 0 };
    int *A = &a[0][0];
    int row, col;
    int i,j;
    row = 3;
    col = 5;
    srand(time(NULL));

    for(i = 0; i<row; ++i){
        int pos[3];//Determine the position this 3 out of 5
        selectPos(col, 3, pos);
        for(j = 0; j< 3 ;++j){
            a[i][pos[j]] = rand()%10 + 1;
        }
    }
    for(i = 0;i<row*col;++i)
        printf("%d ", A[i]);
    printf("\n");
    return 0;
}

答案 1 :(得分:1)

哦!你有太多的循环。对于您的技术,在count == 2ind++时,内部循环和更新(或更正)额外增加就足够了。这将始终初始化一行中的前两个元素,并保持第三个元素不变。

当然,您可以连续初始化2个随机值。从全零矩阵开始。然后遍历每一行。从0, 1, 2中选择一个随机列并设置其值。接下来,再次选择,直到您选择的列不为零。在该列设置值。这是有效的,因为随机值总是不等于零。

当然,您必须将数组编入索引,如i * col + j。 (顺便说一句:如果你的代码中有两个相似的变量,一个名为rows,请不要只调用另一个col .-这会令人困惑。)

答案 2 :(得分:0)

首先,也许你应该定义一个3x3数组:int A [3] [3];

但是如果你真的只想要一个暗淡的数组:int A [9];
您当然可以在代码中定义一组规则(通过您访问和写入它的方式),以便将其视为3x3。但你真正需要做的就是:

int i, A[9];
srand(clock());
for(i=0;i<sizeof(A)/sizeof(A[0]);i++)
{
     A[i] = rand();//using integers here, you can change it back to double       
}  

如果由于某种原因想要增加2,请将for循环行更改为:

for(i=0;i<sizeof(A)/sizeof(A[0]);i+=2)