比较数组中的元素并获取新元素
comparing elements in an array and fetching new ones
我意识到之前有人问过这个问题,我看了一下,但对我来说,它只在一定程度上有效。经过一番挣扎,我想我会问。
我在对象的构造函数中有一组浮点数。
事情是这样的:
count = 3;
angles = new float[count];
尽管我想实现模块化和可重用的方法,但数组长度确实很小。
我循环分配浮点数的数组:
for (int i = 0; i < angles.length; i++) {
angles[i] = radians(random(360));
}
然后,通过一个新的循环,我检查奇异元素之间的角度是否小于 30 度,如果是,则分配一个新的随机值:
for (int i = 0; i < angles.length; i++) {
for (int k = i+1; k < angles.length; k++){
if(angles[i] != angles[k]){
if(abs(angles[i] - angles[k]) <= radians(30)){
angles[i] = radians(random(360));
}
}
}
}
这很好用,但它不能保证新的随机数将与其余元素保持 30 度限制。我认为这与 'for' 循环的长度有关。
克服这个问题并保证新获取的数字始终符合 30 度规则的最佳方法是什么?
您可以将其更改为 while 语句,而不是仅使用 if 语句检查一次,这样它会尝试找到一个新的随机数,直到新的随机数起作用。
while (abs(angles[i] - angles[k]) <= radians(30)){
angles[i] = radians(random(360));
}
但是,如果没有数字符合您的 30 度规则,您的程序将陷入此循环,因此您可能需要在进入循环之前检查是否存在可能的解决方案。
编辑:上述解决方案将确保数字遵循 30 度规则,数组中只有一个数字。添加一个布尔值判断是否满足条件,循环直到布尔值为真。
for (int i = 0; i < angles.length; i++) {
boolean meetsCondition = false;
while (!meetsCondition) {
for (int k = 0; k < angles.length; k++){
if(i != k){
if(abs(angles[i] - angles[k]) <= radians(30)){
angles[i] = radians(random(360));
meetsCondition = false;
break;
}
}
}
meetsCondition = true; //if the for loop completes, it has met the condition.
}
}
为什么不早点使用递归:
for (int i = 0; i < angles.length; i++) {
angles[i] = findSuitable( i==0 ? 0 : angles[i-1] )
}
...
float findSuitable(float limit){
float sample = radians(random(360));
if(Math.abs(sample-limit) > 30)
return sample;
else
return findSuitable(limit);
}
我认为,您可以尝试将随机代码更改为:
随机d = new Random();
int a = d.nextInt(360);
我意识到之前有人问过这个问题,我看了一下,但对我来说,它只在一定程度上有效。经过一番挣扎,我想我会问。 我在对象的构造函数中有一组浮点数。
事情是这样的:
count = 3;
angles = new float[count];
尽管我想实现模块化和可重用的方法,但数组长度确实很小。
我循环分配浮点数的数组:
for (int i = 0; i < angles.length; i++) {
angles[i] = radians(random(360));
}
然后,通过一个新的循环,我检查奇异元素之间的角度是否小于 30 度,如果是,则分配一个新的随机值:
for (int i = 0; i < angles.length; i++) {
for (int k = i+1; k < angles.length; k++){
if(angles[i] != angles[k]){
if(abs(angles[i] - angles[k]) <= radians(30)){
angles[i] = radians(random(360));
}
}
}
}
这很好用,但它不能保证新的随机数将与其余元素保持 30 度限制。我认为这与 'for' 循环的长度有关。
克服这个问题并保证新获取的数字始终符合 30 度规则的最佳方法是什么?
您可以将其更改为 while 语句,而不是仅使用 if 语句检查一次,这样它会尝试找到一个新的随机数,直到新的随机数起作用。
while (abs(angles[i] - angles[k]) <= radians(30)){
angles[i] = radians(random(360));
}
但是,如果没有数字符合您的 30 度规则,您的程序将陷入此循环,因此您可能需要在进入循环之前检查是否存在可能的解决方案。
编辑:上述解决方案将确保数字遵循 30 度规则,数组中只有一个数字。添加一个布尔值判断是否满足条件,循环直到布尔值为真。
for (int i = 0; i < angles.length; i++) {
boolean meetsCondition = false;
while (!meetsCondition) {
for (int k = 0; k < angles.length; k++){
if(i != k){
if(abs(angles[i] - angles[k]) <= radians(30)){
angles[i] = radians(random(360));
meetsCondition = false;
break;
}
}
}
meetsCondition = true; //if the for loop completes, it has met the condition.
}
}
为什么不早点使用递归:
for (int i = 0; i < angles.length; i++) {
angles[i] = findSuitable( i==0 ? 0 : angles[i-1] )
}
...
float findSuitable(float limit){
float sample = radians(random(360));
if(Math.abs(sample-limit) > 30)
return sample;
else
return findSuitable(limit);
}
我认为,您可以尝试将随机代码更改为:
随机d = new Random(); int a = d.nextInt(360);