Java 如何向要循环但跳过子范围的范围中的位置添加值?

Java 如何向要循环但跳过子范围的范围中的位置添加值?,java,algorithm,Java,Algorithm,我正在制作一个生成性的艺术程序,在某些点上,它需要在红色附近随机选择一种颜色。我可以采取几种方法,但我一直在尝试的方法让我感到困惑(现在我只想了解我失败的地方) 如果我们有一个范围(本例中为[0;360])和该范围内的某个位置,我们如何向该位置添加值并跳过子范围,如[30;330]?我找不到合适的方法来做到这一点——在350处加上360不应该输出350,因为每360处都有一个范围,可以跳过几次(例如:如果从那里加上1,它会从29跳到330) 编辑:我一直尝试将主范围设置在0和一个浮点变量之间,并

我正在制作一个生成性的艺术程序,在某些点上,它需要在红色附近随机选择一种颜色。我可以采取几种方法,但我一直在尝试的方法让我感到困惑(现在我只想了解我失败的地方)

如果我们有一个范围(本例中为[0;360])和该范围内的某个位置,我们如何向该位置添加值并跳过子范围,如[30;330]?我找不到合适的方法来做到这一点——在350处加上360不应该输出350,因为每360处都有一个范围,可以跳过几次(例如:如果从那里加上1,它会从29跳到330)

编辑:我一直尝试将主范围设置在0和一个浮点变量之间,并将另一个设置为两个浮点:

静态浮动范围=360;
静态浮动位置=25;//[0;360]内的当前位置
静态浮动skipFrom=30;//从这里跳过
静态浮动skipTo=330;//到这里
这意味着给定的范围是[0;360]。如果我们在
position=23
并添加了2,那么新的位置应该是
330
。所以我会认为它是
position=add(position,2)输出
330

现在,如果
position==355
并且我们添加了
5
,它应该返回
0

但是如果我们添加了
30
(位置
position
等于
335
),它应该返回
330
。我的目的是让它在必要时循环多次(这样我们可以传递比主范围大得多的值,比如1000)

这是我尝试得最多的:

公共类主{
静态浮动范围=360;
静态浮动位置=25;
静态浮动skipFrom=30;
静态浮球=330;
公共静态void main(字符串[]args){
系统输出打印项次(“前”+位置);
位置+=移动色调(6);
System.out.println(“现在”+位置);
}
公共静态浮子移动色调(浮子位移){
如果(位移>=rangeEnd){
位移=移动色调(位移-范围结束);
}
否则,如果(位移>skipFrom和位移
当然,现在我没有考虑好几件事(或者不知道如何实现它们)。我的意图是创建一个函数,在每个循环中丢弃多余的部分,然后添加实际的数字(我想如果我在某个地方取了范围之间的差异,它可能会起作用?)


Amongalen的方法似乎非常有效——我将根据需要调整它:^)

我认为类似的方法或多或少应该有效。可能存在一些逐个错误,因此您需要使用更多值对其进行测试

public class HelloWorld
{
  static int skipStart = 30;
  static int skipEnd = 330;
  static int rangeEnd = 360;

  public static void main(String[] args)
  {
    System.out.println(add(20,5));
    System.out.println(add(20,15));
    System.out.println(add(20,25));
    System.out.println(add(20,35));
    System.out.println(add(20,45));
    System.out.println(add(20,55));
    System.out.println(add(20,65));
    System.out.println(add(20,75));
    System.out.println(add(20,85));
    System.out.println(add(20,95));
    System.out.println(add(20,105));
  }

  public static int add(int curr, int move){

    int movableRange = rangeEnd - (skipEnd-skipStart);
    int result = curr + (move % movableRange);
    result %= rangeEnd;
    if(result>skipStart && result<skipEnd){
        result += (skipEnd-skipStart);
    }
    result %= rangeEnd;
    return result;
  }

}
公共类HelloWorld
{
静态整数skipStart=30;
静态int skipEnd=330;
静态int rangeEnd=360;
公共静态void main(字符串[]args)
{
系统输出打印LN(添加(20,5));
系统输出打印项次(添加(20,15));
系统输出打印项次(添加(20,25));
系统输出打印项次(添加(20,35));
系统输出打印项次(添加(20,45));
系统输出打印项次(添加(20,55));
系统输出打印项次(添加(20,65));
系统输出打印项次(添加(20,75));
系统输出打印项次(添加(20,85));
系统输出打印项次(添加(20,95));
系统输出打印项次(新增(20105));
}
公共静态整数添加(整数当前、整数移动){
int movableRange=rangeEnd-(skipEnd skipStart);
int result=curr+(移动%移动范围);
结果%=范围结束;

如果(result>skipStart&&result定义一个包含有效值的数组,我们将保留该值的索引。对于您给出的示例,假设[30330]和[0,9]无效,因此我们的
数组将包含[10,29]和[331360],请将
索引设置为19和
值[index]
将为29。然后通过向
索引添加一个,您将得到
值[index]
等于331。如果范围没有那么长,并且您没有使用这么多不同的范围集进行操作,则可以接受此值。

我不理解您的问题,您能否编辑您的问题并尝试重新解释?我认为您可能会错误以为将360添加到350不会导致350。您有0-29和331-360。这是60个数字。所以如果你加60,你应该回到350。加360只是做了6次。你仍然会在350。或者我在这里误解了什么?如果我的货币是355(例如)而我的移动50,movableRange=60,result=405。如果无法实现,则返回。result%rangeEnd=405%360=45。正好在应该跳过的范围内。不过这是一个很好的答案,只需解决这个小问题;)@马克:谢谢你指出这一点,它现在应该被修复。不确定这是否是最干净的解决方案,但似乎对我有效。这使得我所尝试的一切更有意义,所以对我来说似乎很棒。