 # Random Elements in Multidimensional Array

Hello community. I hope you are doing well.

My task was to create a multidimensional Array with random elements in each row and column. In result, I got a multidimensional Array which I have identical rows in. The function` randomizer` does not seem to be working as I expected.

May anybody explain why?

``````var word = "contemplation"
var length : Int = word.count + 2
var VH : [[Int]] = [[]]
var randomNum : [Int] = []

func randomizer() -> [Int] {
while randomNum.count != length {
randomNum.append(Int.random(in: 0...9))
print(randomNum.count)
}
return randomNum
}
var counter = 0
repeat {
VH.append(randomizer())
counter += 1
}while counter != length
``````

You have the array `randomNum` outside the function. Moving the `randomNum` variable inside the function will fix your issue.

``````var word = "contemplation"
var length : Int = word.count + 2
var VH : [[Int]] = [[]]

func randomizer() -> [Int] {
var randomNum : [Int] = [] //<---
while randomNum.count != length {
randomNum.append(Int.random(in: 0...9))
print(randomNum.count)
}
return randomNum
}
var counter = 0
repeat {
VH.append(randomizer())
counter += 1
} while counter != length
``````

This way you create a new empty array every time you call the `randomizer` function and then populate it with random numbers.

1 Like

Since `randomNum` is global state that outlives the body of `randomizer` for every call after the first one `randomNum` is already full.

Said another way, the first call to `randomizer` fills `randomNum` with `length` values and nothing ever clears it out so every subsequent call immediately skips over the `while` loop and returns the same array.

Instead of relying on shared mutable state try creating a function that takes in a length and returns an array of random `Int`s.

``````func makeRandomInts(length: Int) -> [Int] {
// Implementation that does not access global state
}
``````
1 Like

Are you familiar with the `map` function? You can achieve this much more succinctly with it:

``````let randomArray2D = (0..<rows).map { _ in
(0..<columns).map { _ in
Int.random(in: range)
}
}
``````
4 Likes

I don't know the map yet. I've been studying swift for only a couple of weeks. I'll take it into account.Thanks.

1 Like