Страницы: 1
RSS
Генератор случайных чисел на несколько строк, Сгенерировать случайные числа с условием среднего значения
 
Здравствуйте. Помогите сделать макрос генерирующий случайные числа на указанное количество строк (в форме) со значением от 0,5 до 500 (можно и больше 500) с условием, что среднее значение всех строк не больше (можно меньше, но не больше) указанного в форме.
Файл пример прикрепил.
 
При таких входных условиях (когда верхняя граница случайных чисел ЗНАЧИТЕЛЬНО больше максимального среднего и количество случайных значений тоже прилично) любой макрос на основе перебора будет работать ОЧЕНЬ долго. Я не дождался  :) Поэтому ввел некоторые ограничения
Код
Private Sub CommandButton1_Click()
ReDim arrRND(0 To Val(Me.TextBox1.Value) - 1)
'UpVal = 500    'верхняя граница случайных чисел
LowVal = 0.5    'нижняя граница случайных чисел
'если верхняя граница случайных чисел больше нужного среднего,
'то верхней границей считается максимальное среднее
If Val(Me.TextBox2.Value) < 500 Then
    UpVal = Val(Me.TextBox2.Value)
Else
    UpVal = 500
End If
Randomize
Do
    For I = 0 To UBound(arrRND)
        arrRND(I) = Round((UpVal - LowVal + 1) * Rnd + LowVal, 2)
    Next
    DoEvents
Loop While Application.Average(arrRND) >= Val(Me.TextBox2.Value)
Range("C1").Resize(UBound(arrRND) + 1) = Application.Transpose(arrRND)
Range("E2") = Round(Application.Average(arrRND), 2)
End Sub
Изменено: Sanja - 26.06.2017 13:24:21
Согласие есть продукт при полном непротивлении сторон
 
Sanja, так получается только рандом до значения текстбокса2. А хотелось бы именно чтоб значения были и больше среднего значения =(
Может и первый вариант дадите попробывать? )))
Изменено: Amirchik - 26.06.2017 14:49:42
 
Просто исключите проверку
Код
Private Sub CommandButton1_Click()
ReDim arrRND(0 To Val(Me.TextBox1.Value) - 1)
UpVal = 500    'верхняя граница случайных чисел
LowVal = 0.5    'нижняя граница случайных чисел

Randomize
Do
    For I = 0 To UBound(arrRND)
        arrRND(I) = Round((UpVal - LowVal + 1) * Rnd + LowVal, 2)
    Next
    DoEvents
Loop While Application.Average(arrRND) >= Val(Me.TextBox2.Value)
Range("C1").Resize(UBound(arrRND) + 1) = Application.Transpose(arrRND)
Range("E2") = Round(Application.Average(arrRND), 2)
End Sub
Согласие есть продукт при полном непротивлении сторон
 
Sanja,  да уж... Так даже на 10 строк делает долго)))  
 
Товарищи, больше нет идей?  
 
в файле 2 варианта
вообще 30 заполненных колонок было получено за 0.734375сек., но размер файла оказался 1 МБ((( 28 пришлось удалить
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко написал: в файле 2 варианта
?
Вы имеете ввиду два СТОЛБЦА? Или варианты ЧЕГО? (*.xlsx)
Согласие есть продукт при полном непротивлении сторон
 
в том файле было 2 варианта (2 столбца по 5тыс. значений в каждом), у которых среднее < заданного 15
перечитал задачу. внес исправления
тут 30 вариантов по 404 значения в каждом. числа псевослучайные от мин. до макс. и, понятно, среднее < 15. все это получено чуть меньше, чем за полсекунды
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко написал: все это получено чуть меньше, чем за полсекунды
Игорь, если затруднит....ЧЕМ получено? Инструмент?
Согласие есть продукт при полном непротивлении сторон
 
Ігор Гончаренко,Извините, я так и не понял где макрос =\ там просто связь с первым файлом, который делает тоже самое что и во втором посте.
 
в файле нет макроса( есть только результаты его работы
Изменено: Ігор Гончаренко - 29.06.2017 23:38:27
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Страницы: 1
Наверх