Как сделать генерацию случайных номеров?
Создайте new map или лучше new set объект, добавляйте туда сгенерированный значения пока десять не наберётся. Перед добавлением проверяйте нет ли такого внутри, иначе заново генерировать. Это буквально цикл while set.size < 10.
Отдельная html это отдельная страница на сервере, сгенерировать в реальном времени из скрипта, несколько я знаю, не выйдет. Можете записать сгенерированные значения в куки, сессию или локалсторэдж, думаю куки подходящее и самое стабильное. После перехода на эту заранее подготовленную страницу, считываете свои знания и выводите их пользователю или если их нет, пишете что тут используются куки, пусть включают.
Насчёт самой генерации, просто рандомные элементы массива с символами или по кодам символов, в интернете много вариантов есть.
Или что-то вы не доопределили, или вопрос тривиальный ( если на считать загадочной фразы "10 случайных номеров (длинной от 9 до 9 символов)").

Генерируем число в диапазоне от 0 до 999999999
Проверяем его неповторность среди ранее сгененированных (которых не больше 10). Если он уникальный - заносим в список. 

import random
num_list=[]
while len(num_list)<10:
    num=str(random.randint(0,999999999)).zfill(9)
    if not num in num_list:
        num_list.append(num)

Результат -  список из десяти неповторяющихся строк (номеров???), например:
print (num_list)
['936581612', '321889578', '969427733', '735243872', '700272151', '018002065', '721644810', '501566972', '283087031', '614022666']

Далее -  помещайте этот список на ту страницу, куда вас должно "перебрасывать".

Ежели все таки длина ваших "номеров" должна быть   1 до 9 символов, тогда zfill() убираем из кода.