我正在通过使用python自动化无聊的东西来学习python,并且随着我在最初章节的进展,我决定尝试编写与作者目的不同的代码。在毒理学课上,老师说一种蜗牛每年死亡率高达12%。所以我决定制作一个代码来计算它。
我制作的代码是:
number= input('Number of individuals: ') #tells the number of individuals in the beggining
count = 0 #tells the nuumber of generations
number=int(number)
percent=input('% of loss per generation ') #% of individuals lost in each generation
percent=int(percent)
#while number > 1:
# number= number*(percent*0.01)
# number=round(number,-1)
# count = count +1
#print('generation ' + str(count) + ':' + str(number*0.1) + ' individuals')
#if number == 1:
# print(' it took ' + str(count) + ' generations to end with the species')
while True:
if number == 1:
print(' it took ' + str(count) + ' generations to end with the species')
if number >1:
number= number*(percent*0.01)
number=round(number,-1)
count = count +1
print('generation ' + str(count) + ':' + str(number*0.1) + ' individuals')
if number == 0 :
break
我试图制作的第一个代码是在评论中,我试图用另一种方法来尝试解决我的问题。
我的问题是: 我想输入个人数量和损失百分比。最后(因为个体不能与自己交配,这是1),我希望它告诉我结束这个物种所需的世代数。当程序循环比它假定的时间多一个时(和之前我使用round()函数它甚至循环更多次)问题开始了,因为我不想要0值,并且当它达到1时我想要它告诉我用它结束了多少代。
我试图寻找答案,但因为我是初学者,我可能无法正确理解正确搜索的条款。 我看到它的方式,程序应该像我想的那样运行,但我想我错过了一些我没有得到的东西。
答案 0 :(得分:0)
看看这个。
number = input('Number of individuals: ') # tells the number of individuals in the beggining
count = 0 # tells the nuumber of generations
number = int(number)
percent = input('% of loss per generation ') # % of individuals lost in each generation
percent = int(percent)
while number > 1:
number = number * (1 - percent * 0.01)
number = int(number)
count = count + 1
print('generation ' + str(count) + ':' + str(number) + ' individuals')
print(' it took ' + str(count) + ' generations to end with the species')
包括@Alans的建议。
永无止境的循环问题的发生是因为最终只有一小部分人死于“死亡”。在您的round(number, -1)
四舍五入后,例如从5个人中死亡0.3人,所以4.7仍然存在,但是四舍五入使他们再次成为5人。 int(number)
向下舍入。
答案 1 :(得分:0)
让我们在评论中讨论代码,因为它是一个更好的解决方案,只需要一些改进。您的代码中存在两个主要问题
1)为什么要打印number * 0.1
而不是number
?它显示1应该显示10,我相信这是误导你的主要问题。
print('generation ' + str(count) + ':' + str(number*0.1) + ' individuals')
2)以下两行必须不在循环中,因为实际上你可以传递1到und将永远不会看到结果消息。这些行必须放在循环之后:
if number == 1:
print(' it took ' + str(count) + ' generations to end with the species')
这是我们的结果:
number= input('Number of individuals: ') # tells the number of individuals in the beggining
count = 0 # tells the nuumber of generations
number=int(number)
percent=input('% of loss per generation ') # % of individuals lost in each generation
percent=int(percent) * 0.01
while number > 1:
number = number * percent
number = round(number)
count = count +1
print('generation ' + str(count) + ':' + str(number) + ' individuals')
print(' it took ' + str(count) + ' generations to end with the species')
<强>更新强>
如果您不介意,可以应用一些次要代码样式改进代码:
更新#2:
我只修复了循环,但正如@Alan在评论中指出的那样,你计算了错误。百分比应为1 - int(percent) * 0.01
number = input('Number of individuals: ') # tells the number of individuals in the beggining
number = int(number)
percent = input('% of loss per generation ') # % of individuals lost in each generation
percent = 1 - int(percent) * 0.01
count = 0 # tells the nuumber of generations
while number >= 2:
number = number * percent
count += 1
print('generation {}: {} individuals'.format(count, round(number)))
print(' it took {} generations to end with the species.'.format(count))
更新#3:
我修改了代码块以改进舍入。它是round(number, -1)
,导致了数十的四舍五入。
答案 2 :(得分:0)
首先,你以错误的方式计算了活蜗牛的数量,每个迭代蜗牛都应该有(100% - 损失%)*蜗牛。 第二件事是条件和圆函数。您的代码很容易陷入损失不足以使前一个数字在舍入后降低的点,例如。 4 * 0.88 = 3.52,四舍五入后再次为4。因此,您可以根据问题的性质从舍入或使用楼层辞职。问题是我们如何治疗0.52的蜗牛?
对于12%的损失和100个人,花了37代才结束了没有四舍五入的物种,并且在使用地板时花了24代才结束物种。
以下代码应该有效。
import numpy as np
while True:
if number <= 1: # <= covers values below 1
print(' it took ' + str(count) + ' generations to end with the species')
break;
if number > 1:
number = number*(1-percent*0.01) # number left is 1 - minus loss percent
# number = np.floor(number) # optional floor
count = count + 1
# print('generation ' + str(count) + ':' + str(number*0.1) + ' individuals')
答案 3 :(得分:0)
您的代码有两个问题:
number = number - number*percent*0.01
只需在代码中更改以上两项内容即可。
更改后的代码:
number= input('Number of individuals: ') #tells the number of individuals in the beggining
count = 0 #tells the nuumber of generations
number=int(number)
percent=input('% of loss per generation ') #% of individuals lost in each generation
percent=int(percent)
while True:
if number <= 1:
print(' it took ' + str(count) + ' generations to end with the species')
break
if number > 1:
number = number - number*percent*0.01
number = round(number,2)
count = count +1
print('generation ' + str(count) + ':' + str(number*0.1) + ' individuals')
print "Number is ",number
if number == 0 :
break
<强>输出:强>
Number of individuals: "10"
% of loss per generation "2"
generation 1:0.98 individuals
Number is 9.8
generation 2:0.96 individuals
Number is 9.6
generation 3:0.941 individuals
Number is 9.41
generation 4:0.922 individuals
Number is 9.22
generation 5:0.904 individuals
Number is 9.04
generation 6:0.886 individuals
Number is 8.86
generation 7:0.868 individuals
Number is 8.68
generation 8:0.851 individuals
Number is 8.51
generation 9:0.834 individuals
Number is 8.34
generation 10:0.817 individuals
Number is 8.17
generation 11:0.801 individuals
Number is 8.01
generation 12:0.785 individuals
Number is 7.85
generation 13:0.769 individuals
Number is 7.69
generation 14:0.754 individuals
Number is 7.54
generation 15:0.739 individuals
Number is 7.39
generation 16:0.724 individuals
Number is 7.24
generation 17:0.71 individuals
Number is 7.1
generation 18:0.696 individuals
Number is 6.96
generation 19:0.682 individuals
Number is 6.82
generation 20:0.668 individuals
Number is 6.68
generation 21:0.655 individuals
Number is 6.55
generation 22:0.642 individuals
Number is 6.42
generation 23:0.629 individuals
Number is 6.29
generation 24:0.616 individuals
Number is 6.16
generation 25:0.604 individuals
Number is 6.04
generation 26:0.592 individuals
Number is 5.92
generation 27:0.58 individuals
Number is 5.8
generation 28:0.568 individuals
Number is 5.68
generation 29:0.557 individuals
Number is 5.57
generation 30:0.546 individuals
Number is 5.46
generation 31:0.535 individuals
Number is 5.35
generation 32:0.524 individuals
Number is 5.24
generation 33:0.514 individuals
Number is 5.14
generation 34:0.504 individuals
Number is 5.04
generation 35:0.494 individuals
Number is 4.94
generation 36:0.484 individuals
Number is 4.84
generation 37:0.474 individuals
Number is 4.74
generation 38:0.465 individuals
Number is 4.65
generation 39:0.456 individuals
Number is 4.56
generation 40:0.447 individuals
Number is 4.47
generation 41:0.438 individuals
Number is 4.38
generation 42:0.429 individuals
Number is 4.29
generation 43:0.42 individuals
Number is 4.2
generation 44:0.412 individuals
Number is 4.12
generation 45:0.404 individuals
Number is 4.04
generation 46:0.396 individuals
Number is 3.96
generation 47:0.388 individuals
Number is 3.88
generation 48:0.38 individuals
Number is 3.8
generation 49:0.372 individuals
Number is 3.72
generation 50:0.365 individuals
Number is 3.65
generation 51:0.358 individuals
Number is 3.58
generation 52:0.351 individuals
Number is 3.51
generation 53:0.344 individuals
Number is 3.44
generation 54:0.337 individuals
Number is 3.37
generation 55:0.33 individuals
Number is 3.3
generation 56:0.323 individuals
Number is 3.23
generation 57:0.317 individuals
Number is 3.17
generation 58:0.311 individuals
Number is 3.11
generation 59:0.305 individuals
Number is 3.05
generation 60:0.299 individuals
Number is 2.99
generation 61:0.293 individuals
Number is 2.93
generation 62:0.287 individuals
Number is 2.87
generation 63:0.281 individuals
Number is 2.81
generation 64:0.275 individuals
Number is 2.75
generation 65:0.269 individuals
Number is 2.69
generation 66:0.264 individuals
Number is 2.64
generation 67:0.259 individuals
Number is 2.59
generation 68:0.254 individuals
Number is 2.54
generation 69:0.249 individuals
Number is 2.49
generation 70:0.244 individuals
Number is 2.44
generation 71:0.239 individuals
Number is 2.39
generation 72:0.234 individuals
Number is 2.34
generation 73:0.229 individuals
Number is 2.29
generation 74:0.224 individuals
Number is 2.24
generation 75:0.22 individuals
Number is 2.2
generation 76:0.216 individuals
Number is 2.16
generation 77:0.212 individuals
Number is 2.12
generation 78:0.208 individuals
Number is 2.08
generation 79:0.204 individuals
Number is 2.04
generation 80:0.2 individuals
Number is 2.0
generation 81:0.196 individuals
Number is 1.96
generation 82:0.192 individuals
Number is 1.92
generation 83:0.188 individuals
Number is 1.88
generation 84:0.184 individuals
Number is 1.84
generation 85:0.18 individuals
Number is 1.8
generation 86:0.176 individuals
Number is 1.76
generation 87:0.172 individuals
Number is 1.72
generation 88:0.169 individuals
Number is 1.69
generation 89:0.166 individuals
Number is 1.66
generation 90:0.163 individuals
Number is 1.63
generation 91:0.16 individuals
Number is 1.6
generation 92:0.157 individuals
Number is 1.57
generation 93:0.154 individuals
Number is 1.54
generation 94:0.151 individuals
Number is 1.51
generation 95:0.148 individuals
Number is 1.48
generation 96:0.145 individuals
Number is 1.45
generation 97:0.142 individuals
Number is 1.42
generation 98:0.139 individuals
Number is 1.39
generation 99:0.136 individuals
Number is 1.36
generation 100:0.133 individuals
Number is 1.33
generation 101:0.13 individuals
Number is 1.3
generation 102:0.127 individuals
Number is 1.27
generation 103:0.124 individuals
Number is 1.24
generation 104:0.122 individuals
Number is 1.22
generation 105:0.12 individuals
Number is 1.2
generation 106:0.118 individuals
Number is 1.18
generation 107:0.116 individuals
Number is 1.16
generation 108:0.114 individuals
Number is 1.14
generation 109:0.112 individuals
Number is 1.12
generation 110:0.11 individuals
Number is 1.1
generation 111:0.108 individuals
Number is 1.08
generation 112:0.106 individuals
Number is 1.06
generation 113:0.104 individuals
Number is 1.04
generation 114:0.102 individuals
Number is 1.02
generation 115:0.1 individuals
Number is 1.0
it took 115 generations to end with the species
答案 4 :(得分:0)
根据Iosif Serafeimidis的回答,这将继续减少人口,直到减少量小于1。正如其他人所说,答案实际上取决于你想要表达的内容。请注意,round(number)将舍入到最接近的整数,而不是int(number),它会舍入到下一个最小的整数。这是修改后的版本:
number = input('Number of individuals: ') # tells the number of individuals in the beginning
count = 0 # tells the nuumber of generations
number = int(number)
percent = input('% of loss per generation ') # % of individuals lost in each generation
percent = int(percent)
while number > 1:
reduction = number * (percent * 0.01)
if reduction < 1:
print('No further reductions possible')
break
number = round(number - reduction)
count = count + 1
print('generation ' + str(count) + ':' + str(number) + ' individuals')
print(' after ' + str(count) + ' generations, there were ' + str(number) + ' individuals')