2D数组中的加权随机数 - 处理

时间:2015-07-14 09:39:00

标签: java random multidimensional-array processing random-sample

我想填充值为1,2,3的3x3 2D数组。

我需要在给定时间内出现每个数字。

例如:

1 to appear 2 times
2 to appear 4 times
3 to appear 3 times

我需要的是将这些数字存储在随机位置的数组中。

例如:

  1,2,2
  3,2,2
  1,3,3

我已经使用计数器控制的2个不同数字以简单的方式完成了这项工作。所以我遍历2D数组并应用数字1和数字2的随机值。 我正在检查值是否为1并将其添加到计数器中,并将其与数字2相同。如果其中一个计数器超过我设置的最大出现次数,则继续并应用其他值。

有没有更好的方法来填充随机数组位置的3个数字?

见下面的代码:

int [][] array = new int [3][3];

int counter1 =0;
int counter2 =0;

for (int i=0; i<3; i++) {
      for (int j=0; j<3; j++) {
        array[i][j] = (int)random(1, 3); //1,2 

          if (arrray[i][j]==1) {
          counter1++;
        } else if (array[i][j] ==2) {
          counter2++;
        } 
       //if it is more than 5 times in the array put only the other value
        if (counter1>5) {
          array[i][j] = 2;
        } 
        //if it is more than 4 times in the array put only the other value
        else if (counter2>4) {
          array[i][j] = 1;
        }
      }
    }

根据这次讨论,我终于做到了这一点:

How can I generate a random number within a range but exclude some?,带有一维数组进行测试,但并不总是有效。 请参阅附件代码:

int []values = new int[28];
int counter1=0;
int counter2=0;
int counter3=0;

for (int i=0; i<values.length; i++) {
      if (counter1==14) {
        ex = append(ex, 5);
      }  
      if (counter2==4) {
        ex =append(ex, 6);
      }  
      if (counter3==10) {
        ex =append(ex, 7);
      }
      values[i] = getRandomWithExclusion(5, 8, ex);

      if (values[i]==5) {
        counter1++;
      } else if (values[i] ==6) {
        counter2++;
      } else if (values[i] ==7) {
        counter3++;
      }
    }

int getRandomWithExclusion(int start, int end, int []exclude) {
    int rand = 0;
    do {
      rand = (int) random(start, end);
    } 
    while (Arrays.binarySearch (exclude, rand) >= 0);
    return rand;
  }

我想用1,6或7填充1D数组。每个数组都是一个特定的数字。 5号可以添加14次。 6号可以添加4次。 7号可以添加10次。

上述代码大部分时间都有效,但有些时候却没有。如果您有任何想法,请告诉我

2 个答案:

答案 0 :(得分:1)

这是您的问题的Octave / Matlab代码。

n=3;
N=n*n;
count = [1 2; 2 4; 3 3];
if sum(count(:,2)) ~= N
    error('invalid input');
end
m = zeros(n, n);
for i = 1:size(count,1)
    for j = 1:count(i,2)
        r = randi(N);
        while m(r) ~= 0
            r = randi(N);
        end
        m(r) = count(i,1);
    end
end
disp(m);

请注意,当您仅使用一个索引处理2D数组时,Matlab / Octave将使用Column-major order

答案 1 :(得分:1)

有很多方法可以做到这一点。由于您正在使用,因此一种方法是从要添加到阵列的所有数字中创建IntList,将其随机播放,然后将其添加到阵列中。像这样:

IntList list = new IntList();
for(int i = 1; i <= 3; i++){ //add numbers 1 through 3
   for(int j = 0; j < 3; j++){ add each 3 times
      list.append(i);
   }
}

list.shuffle();

for (int i=0; i<3; i++) {
   for (int j=0; j<3; j++) {
      array[i][j] = list.remove(0);
   }
}

你也可以采用另一种方式:在数组中创建一个位置的ArrayList,将它们随机播放,然后将你的int添加到这些位置。