Страницы: 1
RSS
Разбить число на N случайных составляющих
 
Здравствуйте!

Задача: Разбить число на N случайных составляющих. Случайные составляющие должны различаться друг от друга с отклонением на заданный процент.
Число N может меняться в диапазоне от 1 до 500. Само число может быть в диапазоне от 1 до 50,000,000
Есть похожее готовое решение (файл excel) , но со значением числа N  = 24. Но при работе с большим исходным числом и количеством составляющих
значения выходят не корректные. Прошу срочно создать универсальный алгоритм для разных значений N и количества составляющих. Оплата гарантируется. Жду ваших предложений!
 
Цитата
Случайные составляющие должны различаться друг от друга с отклонением на заданный процент
а это как? что вы подразумеваете под этим?
вот, допустим, надо 1000 разбить на 5 чисел с отклонением 10%
как влияет параметр 10% на эти 5 слагаемых?
 
возможно я это не корректно предложил, подразумеваю, что составляющие должным быть разными, например  
1000 = 50 + 400 + 200 + 100 + 250

я взял это из примера: "процент отклонения от среднего для случайных чисел", посмотрите описание параметров.

добавлено: в целом задача думаю ясна, я не настаиваю на том, чтобы был регулируемый процент отклонений для случайных чисел, по большому счету мне все равно как это будет сделано, лишь бы был достаточный разброс случайных чисел.
Изменено: RSS - 22.10.2015 07:58:13
 
вот еще один пример, подходящий на доработку, но также не корректные значения, если использовать большие числа.(например число 20000000, а частей 400)
 
В общем я не до конца понял то или не то я сделал, т.к. вначале нужен был регулируемый разброс, а после условие поменялось. В общем на скорую руку.
Скрытый текст
Изменено: JayBhagavan - 22.10.2015 09:38:25

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Перед выходом на работу увидел. Так что возможно есть ошибки (скорее не возможно, а точно). На доработку потребовалось бы еще минут 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
С уважением,
Федор/Все_просто
 
Можно так:
 
JayBhagavan,ваш вариант на первый взгляд работает, проверяется!

Evick, также и ваш вариант на первый взгляд работает, проверяется!

в ближайшее время отпишусь.
 
Evick, Ваш вариант был выбран предпочтительней, так как разброс цифр более равномерный. Сообщите размер оплаты за эту помощь.

JayBhagavan, В вашем варианте, в конце полученного ряда чисел, есть значения, которые во много-много раз превышают средний размер всего ряда. Если размер оплаты не большой, то также оплачу.

Благодарю всех участников за оперативную помощь!
 
RSS, ради интереса делал, т.к. не сразу заметил что тема платная иначе бы не совался. :)
---
Решился таки доработать макрос. (зацепило :) )
Скрытый текст
Изменено: JayBhagavan - 22.10.2015 11:25:08

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Оплата получена. Благодарю.
О. нашёл небольшой косяк. Исправляюсь.
Изменено: Evick - 23.10.2015 15:55:44 (Замена файла)
 
Цитата
JayBhagavan написал:
Решился таки доработать макрос. (зацепило  )
Подскажите, как прописать чтоб  l_num брал число с ячейки одного листа , а результат ставил в другой лист
 
Але Ксандер, этот раздел для платных заказов
Страницы: 1
Наверх