непонятный вывод случайных величин

#python #random

#python #Случайный

Вопрос:

Вот мой код с объяснением того, что я ищу

 #generate a list of variable size between 2 and 6
#each item in the list must contain a float> = 1.5 and <= a 4 and the sum of each item in the list must be >= 8 and <= 12

from random import randint, uniform
import time
NombrePassage = randint(2,6)
passage = []
generated = True
x = 0

while generated:
    heureTotal = 0
    for i in range(NombrePassage):
        tmp = round(uniform(1.5,4),2)
        passage.append(tmp)
        heureTotal = heureTotal   passage[i]
        print(heureTotal)
        time.sleep(0.5) 
    if  heureTotal <= 12.0 and heureTotal >= 8.0:
        print("FINDED")
        generated= False


print(*passage, sep="n")
 

Но результат получается странный. Иногда это работает отлично!

В других случаях вывод циклический. Например:

 6
3.27
6.6899999999999995
9.33
11.68
14.709999999999999
17.0
3.27
6.6899999999999995
9.33
11.68
14.709999999999999
17.0
3.27
6.6899999999999995
9.33
11.68
14.709999999999999
17.0
 

Условие достигнуто, но программа не проверяет его.

Я не понял, что произошло!

(Я новичок в разработке и прошу прощения за плохой английский!)

Комментарии:

1. «условие достигнуто, но программа не проверяет его» — Что заставляет вас думать, что условие достигнуто?

2. Как вы думаете, 7,37 больше или равно 8,0?

3. вы никогда не сбрасываете прохождение, если не можете найти хороший набор, поэтому он просто перебирает элементы, которые вы уже добавили каждый раз.

4. Я изменил сообщение, чтобы изменить выходные данные, здесь условие достигнуто

5. Как вы думаете, 17.0 меньше или равно 12.0?

Ответ №1:

Вам нужно сбрасывать passage настройки каждый раз, когда вы выполняете цикл:

 while generated:
    passage = []
    heureTotal = 0
    for i in range(NombrePassage):
        ...
 

Комментарии:

1. p.s. почти невозможно иметь 2 случайных числа, которые в сумме равняются ровно 8; если NombreRange = 2, вам придется ждать очень долго. в этом случае вам следует просто вручную присвоить каждому элементу значение «4».

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

Ответ №2:

Существует ряд проблем с вашим кодом:

  • Вы продолжаете добавлять до конца passage , но как только вы завершите несколько итераций, вам действительно захочется начать новый список, если цель не была достигнута
  • У вас очень сложные граничные условия, 2 * 4 — это всего лишь 8, поэтому, если вы пытаетесь найти список только с 2 значениями, их должно быть ровно 4, чтобы добавить до 8 (поскольку вы не разрешаете значения больше 4). Аналогично, если вы пытаетесь найти список с 6 значениями, в среднем их должно быть 2 или меньше.

Если вы добавите passage = [] цикл и уберете ожидание time.sleep(0.5) , вы обнаружите, что ваша программа работает.

Это могло бы быть намного проще, хотя:

 from random import randint, uniform

numbers = []
n = randint(2, 6)
while not 8 <= sum(numbers) <= 12:
    numbers = [round(uniform(1.5, 4), 2) for _ in range(n)]
print(numbers)