例如,我有三个变量:“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),它需要适当地映射到它自己的范围。我该怎么做?
答案 0 :(得分:0)
如果您只想采用x
范围内的变量[A, B]
并将其缩放到不同的范围[C, D]
,那么您应该注意:
x - A
位于[0, B - A]
。[0, B - A]
范围内的数字实际上与此问题中解决的问题相同:How do I scale down numbers from rand()?。请注意,如果您使用某些非常简单的技术(如模数运算符),则映射中的分布将不均匀。链接的问题包含一些实现大部分统一映射的合理技术。
在您的情况下,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;
等等......