Задача: Разбить число на N случайных составляющих. Случайные составляющие должны различаться друг от друга с отклонением на заданный процент. Число N может меняться в диапазоне от 1 до 500. Само число может быть в диапазоне от 1 до 50,000,000 Есть похожее готовое решение (файл excel) , но со значением числа N = 24. Но при работе с большим исходным числом и количеством составляющих значения выходят не корректные. Прошу срочно создать универсальный алгоритм для разных значений N и количества составляющих. Оплата гарантируется. Жду ваших предложений!
возможно я это не корректно предложил, подразумеваю, что составляющие должным быть разными, например 1000 = 50 + 400 + 200 + 100 + 250
я взял это из примера: "процент отклонения от среднего для случайных чисел", посмотрите описание параметров.
добавлено: в целом задача думаю ясна, я не настаиваю на том, чтобы был регулируемый процент отклонений для случайных чисел, по большому счету мне все равно как это будет сделано, лишь бы был достаточный разброс случайных чисел.
Перед выходом на работу увидел. Так что возможно есть ошибки (скорее не возможно, а точно). На доработку потребовалось бы еще минут 10-15, но, к сожалению, надо выходить. Если кто хочет, может доработать.
Код
Function SplitNum(num&, splNum&, dev)
Dim av
Dim low, high, dif&, s&
Dim i&, temp&
Dim cln As Collection
Dim blnValid As Boolean
Dim t
Set cln = New Collection
av = num / splNum
low = av - av * dev
high = av + av * dev
DoEvents
s = 0
For i = 1 To splNum - 1
Randomize
temp = CLng(low + (high - low + 1) * Rnd)
s = s + temp
cln.Add temp
Next
Do Until (s - num > low) And (s - num < high)
DoEvents
If s - num > low Then
Randomize
temp = CLng(Rnd * (splNum - 1))
cln(temp) = cln(temp) - CLng((cln(temp) - low) / 2)
End If
If s - num < low Then
Randomize
temp = CLng(Rnd * (splNum - 1))
t = cln(temp)
t = t + CLng((high - t) / 2)
Set cln.Item(temp) = t
End If
Loop
cln.Add s - num
Set SplitNum = cln
End Function
Evick, Ваш вариант был выбран предпочтительней, так как разброс цифр более равномерный. Сообщите размер оплаты за эту помощь.
JayBhagavan, В вашем варианте, в конце полученного ряда чисел, есть значения, которые во много-много раз превышают средний размер всего ряда. Если размер оплаты не большой, то также оплачу.