В данном случае траектория определяется значениями, на которые равномерно увеличиваются elem.style.top и elem.style.left каждые, допустим, 50мс. Первый необходимый вам шаг - прибавить к линейному изменению left параллельное изменение top, и генерировать значения, на которые они должны увеличиваться, случайно. Вот пример:
https://jsfiddle.net/1r6s7gq2. Потом прописать функцию генерации траектории во все нужные места. И тут важным является то, что у разных границ экрана некоторые траектории должны отсекаться. Например, при столкновении с нижней границей, элемент не должен иметь возможность установить траекторию, которая поведёт его дальше вниз. Технически для этого придётся проверять с какой именно границей произошло столкновение, и на основе этой информации в Vx и Vy записывать соответствующие промежутки (пример: после столкновения с нижней границей Vx может быть только getRandomBetween(-5, 0), после столкновения с верхней - только getRandomBetween(0, 5)). Ещё не помешает учесть, что если ставить промежутки с участием нуля, Vx и Vy могут одновременно оказаться со скоростью меньше 0.01 и тому подобное, что будет очень медленно.