Сортировка по среднему числу

Cyprien Lortie

Участник
Автор темы
63
18
Есть 50 чисел (через рандом - от 0.59-0.61) на подобии:
Числа:
0.59256458282471
0.59494507312775
0.59804075956345
0.59178483486176
0.59435659646988
0.59737747907639
0.59721547365189
0.59774696826935
0.59721547365189
0.59774696826935
0.59022492170334
0.59429180622101
0.59855586290359
0.59084403514862
0.5985199213028
0.59707295894623
0.59707295894623
0.5908744931221
0.5987184047699
0.59707295894623
0.59328609704971
0.59328609704971
0.59121304750443
0.59278571605682
0.59867084026337
0.59260100126266
0.59821671247482
0.59078377485275
0.59078377485275
0.59180921316147
0.59180921316147
0.59642028808594
0.59914666414261
0.59603440761566
0.5968542098999
0.59052741527557
0.59648090600967
0.59815311431885
0.59577709436417
0.59650999307632
0.59081995487213
0.59054177999496
0.5933341383934
0.59356135129929
0.59101998806
0.59448885917664
0.59649211168289
0.59944379329681
0.59951776266098
0.59410744905472
Как создать 5 пачек по 10 чисел, чтобы общее среднее было приближено к 0.59452...
На подобии:
1684677333721.png
Числа в пачках не должны повторятся.
 
  • Bug
Реакции: Double Tap Inside

chromiusj

Известный
Модератор
5,631
3,917
мэйби так
Python:
import random

target_mean = 0.59452  # нужное сред знач
num_batches = 5
numbers_per_batch = 10

batches = []
for _ in range(num_batches):
    batch = random.sample([number for number in (random.uniform(0.59, 0.61) for _ in range(numbers_per_batch))], numbers_per_batch)
    batches.append(batch)

for i, batch in enumerate(batches):
    batch_mean = sum(batch) / numbers_per_batch
    print(f"Пачка {i+1}: {batch}")
    print(f"Среднее значение: {batch_mean:.5f}")

all_numbers = [number for batch in batches for number in batch]
all_mean = sum(all_numbers) / (num_batches * numbers_per_batch)
print(f"\nОбщее среднее значение: {all_mean:.5f}")
 

Cyprien Lortie

Участник
Автор темы
63
18
Не совсем то, нужно чтобы из всех 50 перебирались варианты максимально схожие к 0.59452. В твоем варианте, у тебя все суммируется и делится на 10. Я пробовал сделать соотношение в процентах, но там все выводится максимально криво
 

chromiusj

Известный
Модератор
5,631
3,917
можно так попробовать в принципе
Python:
import itertools
import random

def find_combination(numbers, target_mean, batch_size, num_batches):
    closest_mean = float('inf')
    best_combination = None

    combinations = itertools.combinations(numbers, batch_size * num_batches)

    for combination in combinations:
        batches = [combination[i:i+batch_size] for i in range(0, len(combination), batch_size)]

        if len(set(number for batch in batches for number in batch)) != len(numbers):
            continue

        batch_means = [sum(batch) / len(batch) for batch in batches]
        mean = sum(batch_means) / len(batch_means)

        if abs(mean - target_mean) < abs(closest_mean - target_mean):
            closest_mean = mean
            best_combination = batches

            if closest_mean == target_mean:
                break

    return best_combination, closest_mean

numbers = [round(random.uniform(0.59, 0.61), 5) for _ in range(50)]
target_mean = 0.59452
batch_size = 10
num_batches = 5

best_diff = float('inf')
best_combination = None

for _ in range(10000):
    random.shuffle(numbers)
    current_combination, current_mean = find_combination(numbers, target_mean, batch_size, num_batches)
    current_diff = abs(current_mean - target_mean)

    if current_diff < best_diff:
        best_diff = current_diff
        best_combination = current_combination

        if best_diff == 0 or best_diff <= 0.00001:  # условие для остановки поиск
            break

if best_combination:
    for i, batch in enumerate(best_combination, start=1):
        print(f'Пачка {i}: {batch}\nСреднее: {sum(batch) / len(batch)}')
    print(f'Общее среднее: {sum(sum(batch) / len(batch) for batch in best_combination) / len(best_combination)}')
else:
    print('Не удалось найти комбинацию чисел, удовлетворяющую условиям.')
 

Вложения

  • Screenshot_2023_0524_031006.jpg
    Screenshot_2023_0524_031006.jpg
    110.4 KB · Просмотры: 11
Последнее редактирование:

Josski Molodoi

Активный
182
83
Нужно число, приближенное к 0.59452 — сократи диапазон переменных low и high. (я сделал это за тебя)

Python:
import random

low    = 0.59451
high   = 0.59453

packs_count = 5   #Кол-во наборов
packs_len   = 10  #Кол-во чисел в наборах

arr_of_packs = [{"Набор": [], "Среднее": None} for i in range(packs_count)]


def get_medium(numbers: list) -> float:
    return sum(numbers) / len(numbers)

def same_number_exists(num: float) -> bool:
    for pack in arr_of_packs:
        for number in pack["Набор"]:
            if number == num:
                return True

    return False


def main() -> None:
    for pack in arr_of_packs:
        while len(pack["Набор"]) < packs_len:
            rand_num = random.uniform(low, high)

            if not same_number_exists(rand_num):
                pack["Набор"] += [rand_num]
        else:
            pack["Среднее"] = get_medium(pack["Набор"])

    print(arr_of_packs)


if __name__ == "__main__":
    main()

JSON:
[
  {
    'Набор': [
      0.59452520220402,
      0.5945219346742064,
      0.5945239849441804,
      0.5945103163662672,
      0.5945210986481824,
      0.5945114726768601,
      0.5945262848796486,
      0.5945278647918683,
      0.5945235021782627,
      0.5945193742745849
    ],
    'Среднее': 0.5945211035638082
  },
  {
    'Набор': [
      0.5945240556983404,
      0.5945137718941468,
      0.5945122941599897,
      0.5945216126317907,
      0.59452544383679,
      0.5945250517578625,
      0.5945214341696814,
      0.5945155538840273,
      0.5945171641873448,
      0.59452555374078
    ],
    'Среднее': 0.5945201935960753
  },
  {
    'Набор': [
      0.5945137718816479,
      0.5945236173240422,
      0.594511161567528,
      0.5945208281928147,
      0.594522490115567,
      0.5945209929114992,
      0.5945193121482177,
      0.5945284714976264,
      0.5945104964559407,
      0.5945260185276486
    ],
    'Среднее': 0.5945197160622533
  },
  {
    'Набор': [
      0.5945246832697737,
      0.5945124443899157,
      0.5945272940188567,
      0.594512957197822,
      0.5945250230686927,
      0.5945216805643614,
      0.5945125045984773,
      0.5945269420601209,
      0.5945291632498761,
      0.5945261877928855
    ],
    'Среднее': 0.5945218880210782
  },
  {
    'Набор': [
      0.5945131859493903,
      0.5945210901150354,
      0.5945211643579503,
      0.5945115142190934,
      0.594519834856812,
      0.5945174815749449,
      0.594512097472952,
      0.5945271880099422,
      0.5945245926866556,
      0.594516279291905
    ],
    'Среднее': 0.5945184428534682
  }
]
 

Digger Code

Потрачен
12
9
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
собрался крафтить шмотки в кс с заранее известным флоатом? купи подписку готовую, зачем ебаться самому?