#алгоритм #генерация_случайных_данных
На этот вопрос уже даны ответы здесь:
Генерация случайных дробных чисел
(5 ответов)
Закрыт 2 года назад.
Нужно сгенерировать массив чисел, чтобы потом использовать их. Условия:
Задается общая сумма sum
Задается минимальное значение min
Задается максимальное значение max
Задается количество чисел count так, что сумма минимальных значений не превышала
суммы min * count < sum и сумма максимальных была не меньше суммы max * count > sum
Суммарное время всех чисел должно быть равно заданному numbers.Sum() == sum
Числа должны быть случайными в интервале от min до max
Сигнатура функции:
int GenerateNumbers(int min, int max, int count, int sum)
Хотел сделать последовательность чисел по возрастанию, начиная с минимального значения,
а затем перемешать массив. Но как вычислять значение на которое будем увеличивать так
и не понял.
Подскажите, как составить алгоритм?
Ответы
Ответ 1
Пусть общее время T, количество пауз N, минимальная пауза t. Выделим на каждую паузу по t, останется F=T-Nt. Теперь сгенерируем N случайных чисел R[i] Посчитаем их сумму S Нормализуем, чтобы общая сумма была F R[i] = R[i] * F / S И добавим минимальные паузы R[i] = R[i] + t С учётом максимума из моего ответа на EnSO (там не сумма, а среднее, легко модифицировать. Есть код на Python и ссылка на C#). Замечу, что чем больше ограничений, тем менее равномерное распределение будет, но для многих практических целей это не страшно. Сгенерировать случайные значения в диапазоне 0..1 Найти их среднее Применить линейное преобразование R[i] = NeededAverage - average + (r[i] - average) * Math.Min((NeededMax - NeededAverage) / (1 - average), (NeededAverage - NeededMin) / (average))
Комментариев нет:
Отправить комментарий