2013-06-21 7 views
-2

Например, у меня есть три переменные: «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]); 
    } 

индексы а, б и в выбраны случайным образом. Важно заметить, это минимальная и максимальная дальность и его пристройка заданными показателями:

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

где я заменяется на а, Ь и с для каждого диапазона.

EDIT 2

упростить, давайте просто скажем, что есть 3 переменные х, у и г, которые находятся в определенном диапазоне. Каждая переменная имеет свой собственный диапазон. Я хочу вычислить новую переменную p = x + F * (y-z), и ее необходимо соответствующим образом отобразить в ее собственный диапазон. Как мне это сделать?

+0

Можете ли вы быть более точным? Вы хотите добавить p к существующему диапазону/массиву? Какой у вас код? – RST

+3

Вопрос в том, что вы спросили, на него нельзя ответить, потому что это очень неясно. Что вы имеете в виду, когда говорите: «p нужно отображать»? Какое отображение вы хотите? – interjay

+1

Это называется [линейная интерполяция] (http://en.wikipedia.org/wiki/Linear_interpolation). Если вы не знаете математику (** Почему? ** Программистам нужна математика!), Попробуйте придумать решение с помощью ваших клеток мозга.Просто немного усилий, и вы быстро узнаете, что 'new_x = new_min + (old_x - old_min)/(old_max - old_min) * (new_max - new_min)'. –

ответ

0

Если вы хотите принять некоторые переменную x, которая находится в диапазоне [A, B] и масштабировать его на другой диапазон [C, D], то следует отметить, что:

  1. x - A находится в диапазоне [0, B - A].
  2. Масштабирование числа в диапазоне [0, B - A] является той же проблемой, которая разрешена в этом вопросе: How do I scale down numbers from rand()?.

Обратите внимание, что если вы используете какую-то действительно методику наивного типа, такую ​​как оператор модуля, у вас будет неравномерное распределение в ваших отображениях. Связанный вопрос содержит некоторые разумные методы для достижения общего формата . В этом случае p находится в диапазоне [min - max + min, max + max - min].

+0

это немного сложнее, чем это. Я только что отредактировал этот вопрос. Приношу свои извинения за неопределенный вопрос. – user755974

+0

Я думаю, что это решение по-прежнему будет работать для вас, вам просто нужно вычислить диапазон 'p', если' x', 'y' и' z' имеют разные диапазоны. Как правило, если 'p = x + F * (y - z)' и 'F' находится в' [0, 1] ', то' p' находится в '[MIN (x), MAX (x) + MAX (y) - MIN (z)]. Обратите внимание, что я использую '[' и ']', указывая, что диапазоны ** включены **. – CmdrMoozy

+0

@CmdrMoozy Не уверен, что ваш потенциальный диапазон для 'p' вполне прав - рассмотрим встречный пример:' min = 1', 'max = 10',' x = 1', 'y = 1',' z = 10', 'F = 1' ->' p = -8', что немного меньше min ... – twalberg

0

Это зависит от ваших минимальных и максимальных значений. Например, для отображения р от 0 до 1:

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

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

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

и так далее ...

+2

Другим способом отображения 'p' между 0 и 1 является' p = 0.5'. Я не понимаю, как то, что вы делаете, более полезно. – interjay