python编程练习题:随机生成的各科成绩,60分以下为10-15%之间,60-90分的占70-75%之间,90分以上10%-15%之间

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阳光宅男xxb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值