Добавьте случайное целочисленное значение к элементам в списке, но сумма списка не должна изменяться - PullRequest
0 голосов
/ 08 ноября 2019

Я пытаюсь рандомизировать некоторые данные в python, используя следующую формулу:

limit = 10 # value bewteen 0 and 100, const. for all values on the dataset
for old in objects:
    new_v = old + old * int(math.ceil(random_limit(limit))
    new_objects.append(new_v)

def random_limit(limit):
    # create value between [-1; 1)
    rand = np.random.rand()*2.0 - 1.0; 
    return ((rand * float(limit)) / 100.0)

Идея состоит в том, чтобы установить предельный процент рандомизации для начальных old_value. Этот предел должен быть одинаковым для всех данных.

Теперь было бы неплохо, если бы можно было достичь sum(objects) == sum(new_objects). Я понятия не имею, с чего начать и возможно ли это даже при условии limit. Любые идеи?

Пример:

objects:          new_values: 
    [1000,             [1100,
     1200,              1100,
     0900,              0845,
     5700,              5300, 
     8000]              8455]
  sum = 16800           sum = 16800

Таким образом, сумма старых 5 значений и сумма 5 новых значений должны быть одинаковыми, но значения изменяются с пределом и случайнымусловие. В этом примере предел должен составлять 10%, поэтому никакое значение не должно превышать 10%. Для 1000 добавляется 10%, то есть 1100. Для 1200 добавляется -9,09%, поэтому новое значение равно 1100. Это продолжается для других значений с пределом [-10%, 10%).

1 Ответ

1 голос
/ 08 ноября 2019

Ваша проблема - правило 10%, потому что если у вас есть 50000, измененная сумма может быть 5000, что больше, чем другие числа. Поэтому я бы сказал, что один из способов сделать это - упорядочить числа от меньшего к большему и рассчитать изменение до 1-го числа, затем применить противоположное ко 2-му числу, затем вычислить до 3-го и так далее. Вы не можете иметь полностью независимые случайные числа, потому что сумма должна совпадать! Обратите внимание, что вы генерируете только половину чисел, а вторая половина зависит от 1-й половины

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

Таким образом, ваши примерные данные будут иметь порядок

    [1000,             [ 900,
     1200,              1000,
      900,              1200,
     5700,              5700, 
     8000]              8000]

Тогда вы можете сгенерировать случайные числа:

RAND1 = random from -90 to +90
RAND2 = -RAND1
RAND3 = random from -120 to 120
RAND4 = -RAND3 / 2
RAND5 = -RAND3 / 2

Затем вы складываете список случайных чисел с оригинальным списком. Если исходный заказ важен, вам необходимо отследить его перед выполнением расчета.

lets say RAND1 = -30 and RAND3 = 100

[ 870,
 1030,
 1300,
 5650, 
 8050]
...