john doe
john doe

Reputation: 9662

Creating a Scale Between 0 and 1 Even when Higher numbers are passed in

I want to write an algorithm which allows me to rescale numbers to between 0 and 1. This means if I pass 25, 100, 500 then it should generate a new scale and represent those numbers on a scale of 0 to 1.

Here is what I have which is incorrect and does not make sense.

 height: item.height/item.height * 20

Upvotes: 0

Views: 262

Answers (2)

Duncan C
Duncan C

Reputation: 131436

Pass in the numbers in an array.

Loop through the numbers and find the max.

Map the array of integers to an array of Doubles, each one being the value from the source array, divided by the max.

Try to write that code. If you have trouble, update your question with your attempt and tell us what's going wrong.

EDIT:

Your answer shows how to print your resulting scaled values, but you implied that you actually want to create a new array containing the scaled values. For that you could use a function like this:

func scaleArray(_ sourceArray: [Int]) -> [Double] {
  guard let max = sourceArray.max() else {
    return [Double]()
  }
  return sourceArray.map {
    return Double($0)/Double(max)
  }
}

Edit #2:

Here is code that would let you test the above:

func scaleAndPrintArray(_ sourceArray: [Int]) {
  let scaledArray = scaleArray(sourceArray)
  for index in 0..<sourceArray.count {
    print(String(format: "%3d", sourceArray[index]), String(format: "%0.5f",scaledArray[index]))
  }
}

for arrayCount in 1...5 {
  let arraySize = Int(arc4random_uniform(15)) + 5
  var array = [Int]()
  for _ in 1..<arraySize {
    array.append(Int(arc4random_uniform(500)))
  }
  scaleAndPrintArray(array)
  if arrayCount < 5 {
    print("-----------")
  }
}

Upvotes: 3

Kisss256
Kisss256

Reputation: 25

(Sorry but I don't know swift)

If you're wanting to create a linear scale, a linear equation is y(x) = m*x + c. You wish the output to range from 0 to 1 when the input ranges from the minimum value to the maximum (your question is ambiguous, maybe you may wish to lock y(0) to 0).

y(0) = min
y(1) = max

therefore

c = min
m = max - min

and to find the value of any intervening value

y = m*x + c

Upvotes: 0

Related Questions