在Python中模拟降雨

-2 投票
1 回答
1818 浏览
提问于 2025-04-17 22:07

我这几周一直在尝试完成这个项目,但我在代码上搞了很多次,似乎都没有什么效果。我在计算总降雨量、平均降雨量,以及检查是否有超过12天的干旱和超过5天的洪水(降雨量至少为6英寸)时遇到了困难。请帮帮我。我是在用Python 3.3进行这个模拟,模拟的时间是108天,然后是一个世纪。我真的很感激能得到一些帮助。当我运行这个程序时,我得到了一个总降雨量的数字,但这个数字并不是降雨量的总和。关于洪水的部分,我应该使用if语句,但我不太确定该怎么做。还有,对于干旱,我需要显示是否有干旱的情况,也就是连续12天或更长时间没有降雨。

import random 
import math 

def rainFallAmount(x): 
    if chance<=0.71: 
        rainfall=0; 
    elif chance<=0.78: 
        rainfall=0.5; 
    elif chance<=0.85: 
        rainfall=0.75; 
    elif chance<=0.92: 
        rainfall=1.0; 
    elif chance<=0.98: 
        rainfall=1.5; 
    else: 
        rainfall=2.0; 
    return rainfall; 


totalRain = 0; 
day=109; 
num_days_no_rain = 0; # max_days_without_rain 
days_of_drought = 0; # days_not_raining 
days_over15 = 0; 
days_rained = 0; 
years = 100; 
#last_5_days = [0, 0, 0, 0, 0]; 
days = 36500; 
max_drought = 0; 

#This for loop is for 108 days. 
for day in range(109): 
    chance=random.uniform(0,1); 
    rainfall=rainFallAmount(chance); 
    print(rainfall); 
#last_5_days=[day%5]; 
#last_5_days= rainfall; 
#math.fsum([last_5_days]) > 6 
#there was a flood 
    if rainfall<0.5: 
        days_of_drought+=1; 
        days_rained=0; 
        num_days_no_rain+=1; 
    if days_of_drought>max_drought: 
        max_drought=days_of_drought; 
    else: 
        days_rained+=1; 
        if rainfall>=1.5: 
            days_over15+=1; 
            if rainfall>=0.5: 
                totalRain+=1; 
                avgRain=totalRain/day; 

print(rainfall); 
print("The number of days the rain was greater than 1.5 inches: ", days_over15); 
print("The longest period of no rain is: ", num_days_no_rain); 
print("The total rain for", day, "days is:", totalRain); 
print("The average rain per day is: ", avgRain); 
print("The longest period of rain is: ", days_rained); 
print("Longest drought was: ", days_of_drought,"days"); 

#This for loop is for a whole century. 
for years in range(36500): 
    chance=random.uniform(0,1); 
    rainfall =rainFallAmount(chance); 
    print(rainfall); 
    if rainfall == 0: 
        days_of_drought+=1; 
        days_rained=0; 
    if days_of_drought>max_drought: 
        max_drought=days_of_drought; 
        days_rained+=1 
        if rainfall>=0.5: 
            totalRain+=1; 
            avgDayRain=(totalRain/day;)
            avgYearRain=(totalRain/years); 


print("The longest period of no rain is: ", noRain); 
print("The total rain for", years, "years is:", totalRain); 
print("The average rain per year is: ", avgYearRain); 
print("The average rain per day is: ", avgDayRain);

1 个回答

0

如果我理解得没错,你想让变量 totalRain 存储你模拟中所有降雨的总和。你的代码中有很多问题,我只会提几个。

问题出在这个 if 语句上:

if days_of_drought>max_drought: 
    max_drought=days_of_drought; 
else: 
    days_rained+=1; 
    if rainfall>=1.5:    <--- HERE
        days_over15+=1; 
        if rainfall>=0.5: 
            totalRain+=1; <-- HERE
            avgRain=totalRain/day; 

简单来说,这段代码的意思是:“如果降雨量超过 1.5 英寸,那么就把 1 加到所有降雨的总和里。”你可能想表达的是:“把降雨量加到所有降雨的总和里。(不管下得多少都算)。”

另外,if rainfall>=0.5 这个判断没有意义,因为它已经在降雨量超过 1.5 的情况下,所以肯定也会超过 0.5。

顺便说一下,你的代码中不需要使用分号。

试试看下面这样的代码是否符合你的需求:

totalRain+=rainfall
if days_of_drought>max_drought: 
    max_drought=days_of_drought
else: 
    days_rained+=1
    if rainfall>=1.5:
        days_over15+=1
        avgRain=totalRain/day

最后计算 avgRain 的那段代码让我觉得有点问题。你可能需要仔细想想这个变量到底是什么意思,以及应该如何正确计算。

撰写回答