d 【题目】
python编程练习题:随机生成的各科成绩,60分以下为10-15%之间;60-90分的占70-75%之间;90分以上10%-15%之间。
【分析】
各分数之间生成分数的概率并不是独立的,而是相互影响的,比如60分以下的占10%,那么为了满足其他分数段的占比 条件,60-90分的就必须占比75%,90分以的也必须占比15%,否则就会有个分数段的占比超过其要求的占比。 当然,尤其在生成的总分数个数k比较小的情况下,某个分数段的分数个数会超过其规定的占比的一点点: 例如当k=10时,根据要求,60分的只能有1个,60-90最多能有7个,那么90分以上的则只能为2个,超过了15% 但这个情况会随着k的增大而逐渐消除。我们这里设定如果会超,则让60-90分数段的超一点点,其它的在其比例内 (因为,根据习惯,大部分分数集中60-90在这个分数段)
【代码实现】
def generate(k):
'''
目标:随机生成的各科成绩,60分以下为10-15%之间;60-90分的占70-75%之间;90分以上10%-15%之间
参数k:要生成的分数个数
说明:各分数之间生成分数的概率并不是独立的,而是相互影响的,比如60分以下的占10%,那么为了满足其他分数段的占比
条件,60-90分的就必须占比75%,90分以的也必须占比15%,否则就会有个分数段的占比超过其要求的占比。
当然,尤其在生成的总分数个数k比较小的情况下,某个分数段的分数个数会超过其规定的占比的一点点:
例如当k=10时,根据要求,60分的只能有1个,60-90最多能有7个,那么90分以上的则只能为2个,超过了15%
但这个情况会随着k的增大而逐渐消除。我们这里设定如果会超,则让60-90分数段的超一点点,其它的在其比例内
(因为,根据习惯,大部分分数集中60-90在这个分数段)
'''
scores = []
# 随机生成0-60分的占比:[10%~15%]之间
rate_60 = random.uniform(0.1,0.15)
rate_60 = round(rate_60, 2) #保留2位小数
print(str(rate_60))
#确定要生成的0-60分的个数
k_60 = math.floor(k * rate_60)
#0-60分的占比已经确定情况下,计算90分以上的占比
rate_90 = 0
if rate_60 == 0.1:#此时剩余分数段的占比必须取其最大占比数
rate_90 = 0.15
else:
#随机生成90分以上的占比,且使得60-90分占比不超过其最大占比数75%
rate_90_min = 1-rate_60-0.75
rate_90 = random.uniform(rate_90_min,0.15)
rate_90 = round(rate_90, 2)
k_90 = math.floor(k * rate_90)
#剩余的就是60-90分的,直接算剩余分数个数即可
k_60_90 = k-k_60-k_90
print('0~60分数段个数:'+str(k_60),'60~90分数段个数:'+str(k_60_90),'90~100分数段个数:'+str(k_90))
#####方法一:依次序随机生成,先生成60分以下的,在60-90的,再90分以上的##########
print('------------方法一:依次序随机生成,先生成60分以下的,在60-90的,再90分以上的---------------')
# 随机生成60分以下的分数
for i in range(0, k_60):
random_60 = random.choice(range(0, 60))
scores.append(random_60)
# 随机生成60-89的分数
for i in range(0, k_60_90):
random_60_90 = random.choice(range(60, 90))
scores.append(random_60_90)
# 随机生成90以上的分数
for i in range(0, k_90):
random_90 = random.choice(range(90, 101))
scores.append(random_90)
return scores
#方法二:总体按概率随机生成
print('------------方法二:总体按概率随机生成---------------')
while k_60 or k_60_90 or k_90: #每个分数段的分数个数都生成完后结束
random_score = random.choice(range(0, 101))
if random_score<60 and k_60>0:
k_60-=1
scores.append(random_score)
elif random_score>=60 and random_score<90 and k_60_90>0:
k_60_90-=1
scores.append(random_score)
elif random_score>=90 and k_90>0:
k_90 -=1
scores.append(random_score)
return scores
k = eval(input('输入要生成的总分数个数:'))
scores = generate(k)
print(scores)