Страницы

Поиск по вопросам

среда, 5 февраля 2020 г.

Как сгенерировать набор чисел, от мин до макс с указанной суммой? [дубликат]

#алгоритм #генерация_случайных_данных


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

Комментариев нет:

Отправить комментарий