我想填充值为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次。
上述代码大部分时间都有效,但有些时候却没有。如果您有任何想法,请告诉我
答案 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)
有很多方法可以做到这一点。由于您正在使用processing,因此一种方法是从要添加到阵列的所有数字中创建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添加到这些位置。