鱼C论坛

 找回密码
 立即注册
楼主: zltzlt

[已解决]Python:每日一题 261

[复制链接]
发表于 2019-10-23 17:05:21 From FishC Mobile | 显示全部楼层
阴阳神万物主 发表于 2019-10-23 16:10
其实吧,我的思路,用小数来说明是非常困难的,所以我就用分数来说明了。(在草稿上本来就是用分数在表 ...

用频数表示频率当然理解
困惑的是怎么实现从n-1到n的推进的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-23 17:06:32 | 显示全部楼层
Unicorn# 发表于 2019-10-23 14:17
Dynamic Programing 动态规划

那。。。我写的程序也算是DP吧。。。大概?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-23 17:32:24 | 显示全部楼层
danteer 发表于 2019-10-23 17:06
那。。。我写的程序也算是DP吧。。。大概?

应该不是
DP是用过去的状态来描述下一阶段的状态

你的方法很有意思:逐步推进,分配概率而不是频数
我还没能验证它的可行性,无论如何,很有创意的点子
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-23 17:54:06 | 显示全部楼层
Unicorn# 发表于 2019-10-23 17:05
用频数表示频率当然理解
困惑的是怎么实现从n-1到n的推进的

哦,这个啊,其实就是模拟了掷骰子的过程:在 n-1 时已经求出了(n-1)*6-(n-1)个点数,在此基础上再增加一个骰子的变数。假如说:扔三次,得到六点,所有的可能性如下:
1->1->4:p=(1/6)*(1/6)*(1/6) = p(n=2,x=2) * (1/6)
1->2->3与2->1->3:p=((1/6)*(1/6)+(1/6)*(1/6))*(1/6) = p(n=2,x=3) * (1/6)
1->3->2与2->2->2与3->1->2:p=((1/6)*(1/6)+(1/6)*(1/6)+(1/6)*(1/6))*(1/6) = p(n=2,x=4) * (1/6)
1->4->1与2->3->1与3->2->1与4->1->1:p=((1/6)*(1/6)+(1/6)*(1/6)+(1/6)*(1/6)+(1/6)*(1/6))*(1/6) = p(n=2,x=5) * (1/6)
此时p全部加起来,就是扔三次得到六点的总概率了。
所涉及的知识点:古典概型、条件概率
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-23 17:59:58 | 显示全部楼层
Unicorn# 发表于 2019-10-23 17:05
用频数表示频率当然理解
困惑的是怎么实现从n-1到n的推进的

补个传送门:古典概型条件概率
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-23 18:02:11 | 显示全部楼层
本帖最后由 Unicorn# 于 2019-10-23 18:15 编辑
danteer 发表于 2019-10-23 17:06
那。。。我写的程序也算是DP吧。。。大概?


很厉害的思路,学到了学到了
直接对概率进行操作。太厉害了
代码有些地方可以优化,帮你改了下,可读性变强
  1. def func(n):
  2.     if n == 0:
  3.         return []
  4.     else:
  5.         p = 0
  6.         result = {}
  7.         for i in range(6*n+1): #初始化
  8.             result[i] = 0

  9.         while p < n:  #用p模拟掷骰子过程,p = 当前骰子数
  10.             for i in range(p,6*p+1):
  11.                 for j in range(1,7):
  12.                     e = 1/(6**(p+1)) #单位概率
  13.                     result[i+j] += e
  14.                     result[i] -= e  #原有的某种情况中分出另一种情况的概率
  15.             p += 1
  16.         
  17.         for i in range(1,n):
  18.             result[i] = 0
  19.         list1 = []
  20.         for each in result:
  21.             if result[each] > 0:
  22.                 list1.append([each,result[each]])
  23.         return list1
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-23 18:05:30 | 显示全部楼层
阴阳神万物主 发表于 2019-10-23 17:54
哦,这个啊,其实就是模拟了掷骰子的过程:在 n-1 时已经求出了(n-1)*6-(n-1)个点数,在此基础上再增加一 ...

思路都差不多嘛
从状态n-1推出状态n,这就是DP哦。只是我们的程序实现方式不同啦
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-23 18:06:20 | 显示全部楼层
阴阳神万物主 发表于 2019-10-23 17:59
补个传送门:古典概型、条件概率

这个当然知道的啦
<等待下一期中........>
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-23 18:10:25 | 显示全部楼层
Unicorn# 发表于 2019-10-23 18:02
很厉害的思路,学到了学到了
直接对概率进行操作。太厉害了
代码有些地方可以优化,帮你改了下,可读性 ...

多谢多谢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-23 18:24:55 | 显示全部楼层
Unicorn# 发表于 2019-10-23 18:05
思路都差不多嘛
从状态n-1推出状态n,这就是DP哦。只是我们的程序实现方式不同啦

哦,原来是这样啊,对于算法,我了解得还不够呢。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-10-23 20:08:20 | 显示全部楼层

输入:1
输出:[[1,0.17],[1,0.17],[1,0.17],[1,0.17],[1,0.17],[1,0.17]]
预期结果:[[1,0.17],[2,0.17],[3,0.17],[4,0.17],[5,0.17],[6,0.17]]
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-23 20:08:53 | 显示全部楼层
  1. def points_count(n):
  2.     '''
  3.         求S集合
  4.     '''
  5.     num = [1,2,3,4,5,6]
  6.     if n==1:
  7.         return num
  8.     else:
  9.         points = points_count(n-1)
  10.         points_num = []
  11.         for i in num:
  12.             points_num.extend(map(lambda x:x+i,points))
  13.         return points_num


  14. def prob_count(points_num):
  15.     '''
  16.         计算相应的概率
  17.     '''
  18.     num = len(points_num)
  19.     points_set_list = list(set(points_num))
  20.     prob_list = map(lambda x:[x,points_num.count(x)/num],points_set_list)
  21.     return prob_list



  22. print(list(prob_count(list(points_count(2)))))
复制代码

评分

参与人数 1贡献 +2 收起 理由
zltzlt + 2

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-10-23 20:09:55 | 显示全部楼层
danteer 发表于 2019-10-22 22:10
这是纯粹拿浮点数算的,可能后面几位数字就不大对了。不过今天没空改上去了。
超时警报

输入:3
输出:[[3,0.03],[4,0.06],[5,0.10],[6,0.13],[7,0.16],[8,0.14],[9,0.11],[10,0.08],[11,0.06],[12,0.03],[13,0.03],[14,0.02],[15,0.02],[16,0.01],[17,0.01],[18,0.00]]
预期结果:[[3,0.00],[4,0.01],[5,0.03],[6,0.05],[7,0.07],[8,0.10],[9,0.12],[10,0.13],[11,0.13],[12,0.12],[13,0.10],[14,0.07],[15,0.05],[16,0.03],[17,0.01],[18,0.00]]
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-10-23 20:14:16 | 显示全部楼层

输入:3
输出:[[3,0.00],[4,0.01],[5,0.03],[6,0.05],[7,0.07],[8,0.10],[9,0.12],[10,0.12],[11,0.12],[12,0.12],[13,0.10],[14,0.07],[15,0.05],[16,0.03],[17,0.01],[18,0.00]]
预期结果:[[3,0.00],[4,0.01],[5,0.03],[6,0.05],[7,0.07],[8,0.10],[9,0.12],[10,0.13],[11,0.13],[12,0.12],[13,0.10],[14,0.07],[15,0.05],[16,0.03],[17,0.01],[18,0.00]]
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-10-23 20:15:08 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-10-23 20:18:20 | 显示全部楼层
战场原 发表于 2019-10-22 22:25
def solution(n: int) -> list:
    import collections
    count = 6**n

输入:3
输出:[[3,0.00],[4,0.01],[5,0.03],[6,0.05],[7,0.07],[8,0.10],[9,0.12],[10,0.12],[11,0.12],[12,0.12],[13,0.10],[14,0.07],[15,0.05],[16,0.03],[17,0.01],[18,0.00]]
预期结果:[[3,0.00],[4,0.01],[5,0.03],[6,0.05],[7,0.07],[8,0.10],[9,0.12],[10,0.13],[11,0.13],[12,0.12],[13,0.10],[14,0.07],[15,0.05],[16,0.03],[17,0.01],[18,0.00]]
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-10-23 20:19:28 | 显示全部楼层
阴阳神万物主 发表于 2019-10-22 23:27
数学是个很好的工具,这里我使用概率学的古典概型
毕竟,满足古典概型的特性:
1.所有可能出现的基本事件 ...

恭喜通过!

执行用时:988 ms
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-10-23 20:20:38 | 显示全部楼层
__mrsq__ 发表于 2019-10-23 10:57
我这个好像蛮快的,但是不知道结果是否正确

输入:3
输出:[[3,0.00],[4,0.01],[5,0.03],[6,0.05],[7,0.07],[8,0.10],[9,0.12],[10,0.12],[11,0.12],[12,0.12],[13,0.10],[14,0.07],[15,0.05],[16,0.03],[17,0.01],[18,0.00]]
预期结果:[[3,0.00],[4,0.01],[5,0.03],[6,0.05],[7,0.07],[8,0.10],[9,0.12],[10,0.13],[11,0.13],[12,0.12],[13,0.10],[14,0.07],[15,0.05],[16,0.03],[17,0.01],[18,0.00]]
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-10-23 20:22:24 | 显示全部楼层
塔利班 发表于 2019-10-23 12:57
理清了顺序重写了

这才是真正的大佬

执行用时:1063 ms
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-23 20:22:41 | 显示全部楼层
zltzlt 发表于 2019-10-23 20:20
输入:3
输出:[[3,0.00],[4,0.01],[5,0.03],[6,0.05],[7,0.07],[8,0.10],[9,0.12],[10,0.12],[11,0.12] ...

这个好像是round函数输出0.125没进位,那我不用round你看看可以吗
  1. def dice_outcome(dice_num):
  2.     pro = [1] * 6
  3.     n = dice_num
  4.     d = 6**dice_num
  5.     res = []
  6.     while dice_num > 1:
  7.         media_list = [0] * (len(pro) + 5)
  8.         length = len(media_list)
  9.         for index in range(int(length / 2 + 0.5)):
  10.             if index > 5:
  11.                 start = index - 5
  12.             else:
  13.                 start = 0
  14.             for ele in pro[start:index + 1]:
  15.                 media_list[index] += ele
  16.             media_list[length - 1 - index] = media_list[index]
  17.         pro = media_list
  18.         dice_num -= 1
  19.     for num in pro:
  20.         res.append([n,num/d)])
  21.         n += 1
  22.     return res

  23. print(dice_outcome(100))
复制代码

评分

参与人数 1贡献 +2 收起 理由
zltzlt + 2

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-13 19:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表