Нахождение среднего числа с плавающей запятой случайного списка в python - PullRequest
2 голосов
/ 19 июня 2020

Я просмотрел несколько веб-сайтов, книг и документации и не могу понять, что я делаю не так. Я пытаюсь попросить о помощи в крайнем случае, чтобы научиться самостоятельно, но я потратил слишком много времени, пытаясь понять это, и я уверен, что я делаю что-то очень простое, но делаю это неправильно, но я учусь. Код при каждом запуске дает один разный результат. Код вызывает следующую ошибку: 26.8 Traceback (последний вызов последний): файл «main.py», строка 7, в tot = sum (rand) / len (rand) TypeError: объект «float» не повторяется

import random
for x in range (10000):
   rand = random.uniform(10, 100)
   print(round(rand, 1))

   tot = sum(rand)/len(rand)
   print (round(tot, 1))

Ответы [ 2 ]

2 голосов
/ 19 июня 2020

На самом деле вы не создаете список, вы генерируете отдельные значения. Вы действительно хотите распечатать 10000 значений на пути к окончательному результату?

Если ответ «нет!», То ваш код можно уменьшить до:

import random

N = 10000
print(round(sum(random.uniform(10, 100) for _ in range(N)) / N, 1))

или , если вы предпочитаете немного разбить его для удобства чтения:

import random

N = 10000
total = sum(random.uniform(10, 100) for _ in range(N))
average = total / N
print(round(average, 1))

Если это выходит за рамки того, что вы узнали, вы можете создать total за пределами инициализированного l oop до нуля, обновляйте его с каждым новым значением по мере прохождения l oop, а затем вычисляйте окончательный ответ:

import random

N = 10000
total = 0.0
for _ in range(N):     # use '_' instead of x, since x was unused in your prog
    total += random.uniform(10, 100)
average = total / N
print(round(average, 1))

Это позволяет не тратить впустую хранилище для списка из 10000 значений и избежать append() вы еще не знакомы с. Конечно, если вам понадобятся 10000 значений позже для других целей, вам нужно будет спрятать их в список:

import random

N = 10000
l = [random.uniform(10, 100) for _ in range(N)]
total = sum(l)
print(round(total / N, 1))

Дополнение

Просто для удовольствия, вы также можете сделать это рекурсивно:

import random

def sum_of_rands(n):
    if n > 1:
        half_n = n // 2
        return sum_of_rands(half_n) + sum_of_rands(n - half_n)
    elif n == 1:
        return random.uniform(10, 100)

N = 10000
print(round(sum_of_rands(N) / N, 1))
print(sum_of_rands(0))  # returns None because nothing is being summed

Разделение задачи пополам (в среднем) при каждом рекурсивном вызове сохраняет стек равным O (log N).

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

1 голос
/ 19 июня 2020

В функции суммы вы должны анализировать повторяемый объект, но вы анализируете объект с плавающей запятой. Чтобы избежать этой ошибки, вы должны поместить две последние строки за пределы l oop и добавить rand в список. Не знаю, хотите ли вы этого, но он показывает вам, как использовать sum:

import random
l = []
for x in range(10000):
    rand = random.uniform(10, 100)    
    l.append(rand)
    print(round(rand, 1))

tot = sum(l)/len(l)
print(round(tot, 1))
...