将值映射到某个范围

时间:2013-06-21 17:29:24

标签: c++

例如,我有三个变量:“x”,“y”和“z”。它们都来自特定范围{min,max}。 现在,我想计算一个新变量,假设p = x + F *(yz),其中F是介于0和1之间的常量。这个新的计算变量“p”需要映射到{min,max}之上范围。我该怎么做?

编辑1

将数字生成到数组中:

population[D*id]=0;
    population[D*id+N]=0;
    population[D*id +2*N]=0;

    population[D*id+1]=rndFloat(globalState,threadIdx.x,4);
    population[D*id+N+1]=0;
    population[D*id +2*N+1]=0;

    for(int i=2; i<N; i++){
        float min= -4 - 1/4*abs((int)((i-4)/3));
        float max= 4 + 1/4*abs((int)((i-4)/3));
        if(i==2)
        {
            population[D*id+2]=rndFloat(globalState,threadIdx.x,3.14159265359);
            population[D*id+N+2]=rndFloat(globalState,threadIdx.x,min,max);
            population[D*id +2*N+2]=0;
        }
        else
        {
            population[D*id +i]=rndFloat(globalState,threadIdx.x,min,max);
            population[D*id+N+i]=rndFloat(globalState,threadIdx.x,min,max);
            population[D*id +2*N+i]=rndFloat(globalState,threadIdx.x,min,max);
        }
    }

计算新变量:

for(int i=0; i<D-1; i++)
    {
        pop[D*id+i]= population[D*a +i] + F*(population[D*b +i]-population[D*c +i]);
    }

随机挑选指数a,b和c。 需要注意的重要事项是最小和最大范围及其对给定指数的依赖性:

float min= -4 - 1/4*abs((int)((i-4)/3));
        float max= 4 + 1/4*abs((int)((i-4)/3));

其中i被每个范围的a,b和c替换。

编辑2

为了简化,我们只说有3个变量x,y和z在一定范围内。每个变量都有自己的范围。我想计算新的变量p = x + F *(y-z),它需要适当地映射到它自己的范围。我该怎么做?

2 个答案:

答案 0 :(得分:0)

如果您只想采用x范围内的变量[A, B]并将其缩放到不同的范围[C, D],那么您应该注意:

  1. x - A位于[0, B - A]
  2. 范围内
  3. 缩放[0, B - A]范围内的数字实际上与此问题中解决的问题相同:How do I scale down numbers from rand()?
  4. 请注意,如果您使用某些非常简单的技术(如模数运算符),则映射中的分布将不均匀。链接的问题包含一些实现大部分统一映射的合理技术。

    在您的情况下,p的范围为[min - max + min, max + max - min]

答案 1 :(得分:0)

这取决于你的最小值和最大值。 例如,要将p映射到0和1之间:

if (p < 10)
    p /= 9.0f;

else if (p < 100)
    p /= 99.0f;

else if (p < 1000)
    p /= 999.0f;

等等......