Генерировать числа с заданной вероятностью?
В каждом языке программирования присутствует специальная функция для генерирования случайных чисел от 0 до 1. Соответственно, вы представляете ваши числа в виде интервалов, а случайное число в виде относительной координаты. В какой интервал укажет координата, то число и является искомым.

Пример
Дана таблица:
1 - 0.9
2 - 0.8
3 - 0.7
Тогда интервалы будут следующие: 0-0.9, 0.9-1.7, 1.7-2.4. 
Допустим, сгенерировано случайно число 0.65 - примем его за относительные координаты.
Переводим координаты в абсолютные 0.65*2.4=1.56. Следовательно, случайно число попадает в интервал 0.9-1.7, значит искомое число - 2.
приведу пример кода на python с использованием библиотеки numpy
import numpy as np
sample_space = [0,1,2,3,4,5,6]
probabilities = [0.3,0.2,0.05,0.05,0.1,0.15,0.15]
n = 20
result = np.random.choice(sample_space,size=n,p=probabilities)
print(result)
sample_space - лист откуда будет производится выборка
probabilities - лист соответствующих вероятностей (0 с вероятностью 0.3,  1 с вероятностью 0.2, и.т.д) вероятности я взял свои, вы поставите свои главное чтобы вероятности в сумме были 1.
n - количество сгенерированных чисел для примера я взял 20, вы зададите сколько ва нужно.
функция choice также имеет параметр replace по умолчанию установленный в True он регулирует может ли ранее выбранный элемент, быть выбранном снова, в нашем случае могут ли быть повторения при выборке из sample_space  (по умолчанию может).
Насчет нормирования вероятностей, такое возможно только если n=2, или если есть дополнительная информация позволяющая создать систему уравнений. В вашем случае это невозможно например
возьмем нашу дистрибуцию мы имеем 0 с вероятностью 0.3, мы меняем ее 0.2, у нас будет существовать бесконечное количество сценариев как мы можем раскидать 0.1 на остальные 6 элементов. Уникального решения не существует.