#алгоритм #генерация_случайных_данных
На этот вопрос уже даны ответы здесь: Генерация случайных дробных чисел (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))
Комментариев нет:
Отправить комментарий