“卖榴莲”问题:概率问题的程序模拟实践

一、问题

前几天考数学的时候,看到了这么一道题:

幸福村决定将优质榴莲拿出来进行趣味叫卖,在吸引游客的同时获取更高的利润,叫卖的方式如下:以40元/斤为初始单价,通过电脑随机出现的数字确定新单价,电脑会随机出现数字0,1,2,…,9这十个数字中的一个。若出现的数字不超过6,则在原单价的基础之上增加20元作为新单价;若出现的数字超过6,则在原单价的基础上增加10元作为新单价,重复上述过程。若出现150元/斤 的叫价,则停止叫价,游客以150元/斤的单价购买优质榴莲;若未出现,则失去叫价资格。现有一游客参加了本次叫卖,试估计该游客成功买到优质榴莲的概率。

考试的时候看着这两百来字,再看了看表,还剩二十分钟,直接就丢掉了这道题…
考完试一看,又感觉有点搞头
诶,那就开整吧!

二、分析

通读整题,可以发现整个过程就是一个循环,一直把单价往高抬,直到出现150或者错过150(顺便嘀咕一句,什么优质榴莲他喵的那么贵…)
举个栗子:

  • 第一次抽到7(大于6),单价为40 + 10 = 50
  • 第二次抽到3(小于6),单价为50 + 20 = 70
  • 第三次抽到7(大于6),单价为70 + 10 = 90
  • 第四次抽到1(小于6),单价为90+ 20 = 110
  • 第五次抽到9(大于6),单价为110 + 20 = 130
  • 第六次抽到7(大于6),单价为130 + 20 = 150
  • 这样就叫卖成功辣!

在搞清楚流程之后,就可以开始编写程序啦(为了使结果准确,打算用大量游客来进行叫卖,所以在叫卖的循环之外还要再嵌套一层游客一个个进行叫卖的while循环

三、编程

1、Python

在线试运行:https://onlinegdb.com/gfUHopzFW

m = int(input("叫卖人数:"))
import random

i = 1
n = 0

def p_add(price_0):
	"""模拟叫价的函数"""
    adds = random.randint(0,9)
    if adds <= 6:
        price_0 += 10
    else:
        price_0 += 20
    print("  抽到了",adds,"价格变为",price_0)
    return price_0
    
while i <= m: 
# 游客层面的循环
    print("\n\n第",i,"位客人开始叫卖,底价为40")
    price_0 = 40 # 下一位客人叫卖时,需要初始化单价为40
    p_continue = True
    while p_continue:
    # 单个游客叫价层面的循环	
        price_0 = p_add(price_0) # 调用函数进行叫价
        if price_0 == 150:
            print("  这位客人成功买到了优质榴莲")
            n += 1
            p_continue = False
        elif price_0 >= 150:
            print("  这位客人叫卖失败")
            p_continue = False
    i += 1

p = n / m
print("\n\n一共有",m,"位客人进行叫卖,其中",n,"位叫卖成功,成交率为",p)

运行结果:

叫卖人数:100001 位客人开始叫卖,单价为40
  抽到了 9 价格变为 60
  抽到了 9 价格变为 80
  抽到了 3 价格变为 90
  抽到了 0 价格变为 100
  抽到了 0 价格变为 110
  抽到了 5 价格变为 120
  抽到了 3 价格变为 130
  抽到了 4 价格变为 140
  抽到了 7 价格变为 160
  这位客人叫卖失败

--中略--10000 位客人开始叫卖,底价为40
  抽到了 1 价格变为 50
  抽到了 6 价格变为 60
  抽到了 9 价格变为 80
  抽到了 1 价格变为 90
  抽到了 8 价格变为 110
  抽到了 0 价格变为 120
  抽到了 2 价格变为 130
  抽到了 0 价格变为 140
  抽到了 6 价格变为 150
  这位客人成功买到了优质榴莲


一共有 10000 位客人进行叫卖,其中 7680 位叫卖成功,成交率为 0.768

结果为:0.768

2、C语言

在线试运行:https://onlinegdb.com/X6eBomSYd

#include <stdio.h>  //包含标准输入输出的头文件
#include <stdlib.h> //包含用于生成随机数的rand()函数的头文件
#include <stdbool.h> //包含布尔型的头文件

int main(void)
{
    int m,adds,price_0; //只涉及整数运算,声明整型的变量(下同)
    int i = 1;
    int n = 0;
    bool p_continue;  //p_continue的值为True或False,因此使用布尔型的变量
    
    printf("叫卖人数:");   scanf("%d",&m);
    
    while (i <= m) {
        printf("\n\n第%d位客人开始叫卖,底价为40\n",i);
        
        price_0 = 40;
        p_continue = true;
        
        while (p_continue) {  //目前还没学到C语言函数的声明和调用,直接写到一起…
            adds = rand()%10;
            
            if (adds <=6)
                price_0 += 10;
            else 
                price_0 += 20;
            printf("  抽到了%d,价格变为%d\n",adds,price_0);
            
            if (price_0 == 150) {
                printf("  这位客人叫卖成功\n");
                n += 1;
                p_continue = false;
            }
            else if (price_0 >= 150) {
                printf("  这位客人叫卖失败\n");
                p_continue = false;
            }
        }
        i += 1;
    }
    printf("\n\n一共有%d位客人进行叫卖,其中%d人叫卖成功,成交率为%.2f\n",m,n,(double)n / m);
    
    return 0;
    
}

运行结果:

叫卖人数:100001位客人开始叫卖,底价为40
  抽到了3,价格变为50
  抽到了6,价格变为60
  抽到了7,价格变为80
  抽到了5,价格变为90
  抽到了3,价格变为100
  抽到了5,价格变为110
  抽到了6,价格变为120
  抽到了2,价格变为130
  抽到了9,价格变为150
  这位客人叫卖成功

--中略--10000位客人开始叫卖,底价为40
  抽到了9,价格变为60
  抽到了5,价格变为70
  抽到了8,价格变为90
  抽到了6,价格变为100
  抽到了7,价格变为120
  抽到了6,价格变为130
  抽到了6,价格变为140
  抽到了5,价格变为150
  这位客人叫卖成功


一共有10000位客人进行叫卖,其中7761人叫卖成功,成交率为0.78

结果为:0.78

四、校对答案

(瞄一眼参考答案) 理论计算得P = 0.77,程序模拟结果与其大致吻合,本次实践基本成功。

五、结束语

感谢每一个坚持看到这里的小伙伴!

把自己的思路说出来并让人明白并不容易,而我也正在努力做到这一点。

本人正在读高三,用来学Python和C语言的时间不多,难免有错误和偏颇之处,还请各位多多包涵,不吝指教。

如果觉得这篇文章有用的话,请点一个小小的赞吧~

  • 13
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值