一个问题要求我输出一个数字的值(如果它小于先前的输出,但是不小于该数字),请跳过它并继续循环直到找到较小的数字,然后重复直到最小的数字被发现。我已经使方程式可以输出随机结果,但是我很难找到如何使数字降到最小的值。
我尝试在while循环中使用if语句,但是它会引发错误或仅输出一个值并且不会继续。
import random
time = 1
while time > 0:
f1 = random.random()
f2 = random.random()
f3 = random.random()
x = 15*(f1/(f1+f2+f3))
y = 15*(f2/(f1+f2+f3))
z = 15*(f3/(f1+f2+f3))
sum_fifteen = x+y+z
from math import sqrt
time = ((sqrt(8**2 + (x**2)))/3) + (y/5) + ((sqrt(6**2 + (z**2)))/4)
print (time)
我希望输出递减直到没有较小的值,但实际上输出的结果在6到7之间是无限的
答案 0 :(得分:1)
由于业障低,我无法评论您的问题,但根据我的阅读
如果一个数字的值小于前一个输出但不小于该数字,则输出它的值,跳过它并继续循环直到找到一个较小的数字,然后重复直到找到最小的数字为止
事实是,当找到最小可能的数字时,您必须停止操作。因此,您可以考虑任意范围的数字,例如要在7到9之间生成随机数。 我不知道是否必须为浮点数或整数,但是您可以看一下random.uniform(a,b),它从uniform distribution a和b。 所以如果你拿
number = random.uniform(6,9)
并创建一个循环,当生成的数字小于7时该循环将停止,该数字应为您已获取的最小数字。 对您来说,打印比上一个数字小的数字应该很容易。
答案 1 :(得分:1)
在所需的代码下面。
我清理了您提供的代码并进行了一些修改。
无限循环的主要问题是您的条件time > 0
(总是如此)。
import random
from math import sqrt
# We choose arbitrarily value bigger than 7
res = 10
old_res = 11
cur_res = 10
accuracy = 0.01
while old_res-res > accuracy:
f1 = random.random()
f2 = random.random()
f3 = random.random()
x = 15*(f1/(f1+f2+f3))
y = 15*(f2/(f1+f2+f3))
z = 15*(f3/(f1+f2+f3))
cur_res = ((sqrt(8**2 + (x**2)))/3) + (y/5) + ((sqrt(6**2 + (z**2)))/4)
if cur_res < res:
old_res = res
res = cur_res
print (res)
我已经用res重命名了time,这很容易混淆,我为res管理了三个变量。
cur_res
:包含计算的当前值
res
:包含最小值
old_res
:包含res
之后的最后一个最佳结果。
如果要找到接近6的最佳结果,可以修改accuracy
。 (只是old_res - res
)。
提高准确性以获得更好的结果。