一、问题
前几天考数学的时候,看到了这么一道题:
幸福村决定将优质榴莲拿出来进行趣味叫卖,在吸引游客的同时获取更高的利润,叫卖的方式如下:以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)
运行结果:
叫卖人数:10000
第 1 位客人开始叫卖,单价为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;
}
运行结果:
叫卖人数:10000
第1位客人开始叫卖,底价为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语言的时间不多,难免有错误和偏颇之处,还请各位多多包涵,不吝指教。
如果觉得这篇文章有用的话,请点一个小小的赞吧~