找回密码
 欢迎注册
查看: 34213|回复: 10

[提问] 打靶

[复制链接]
发表于 2013-3-20 00:08:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
一运动员打靶,靶一共10环, 求打10枪后总成绩58环的可能。
下面的代码内存不够
  1. Join @@ (Permutations /@ IntegerPartitions[58, {11}, Range[0, 10]]) //Length // Timing
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2013-3-20 00:12:10 | 显示全部楼层
不知道Mathematica的Probability函数能不算这道题
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-3-20 09:14:22 | 显示全部楼层
缺少分析数据的
比如该运动员平均成绩
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-3-20 09:14:34 | 显示全部楼层
你不能从0-10随机的
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-3-20 09:36:19 | 显示全部楼层
1# chyanog

假如,每一枪都在1到10环中均匀随机,那么:
10枪打58环的可能是:0.0410820025
附上python代码:
  1. import numpy as np
  2. def nDm(n,m,x):
  3.     '''同时掷n个m面(面上的数字为1到m)骰子,和为x(x<=n*m)的概率'''
  4.     if x<=n*m and x>=m:
  5.         Alpha=np.ones(m+1)/m
  6.         Alpha[m]=0
  7.         alpha=Alpha
  8.         for k in range(1,n):
  9.             alpha=np.convolve(Alpha,alpha);
  10.         return alpha[n*m-x]
  11.     else:
  12.         return 0.0
复制代码

评分

参与人数 1鲜花 +12 收起 理由
wayne + 12 不错!

查看全部评分

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-3-20 09:53:04 | 显示全部楼层
楼主例子给的不太对,简单的说,就是十个均匀【1,,10】的随机数和小于58的概率是多少。
  1. xx=x/@Range[7];Probability[Total[xx]<=58,Distributed[#,DiscreteUniformDistribution[{1,10}]]&/@xx]
复制代码
用Probability也很慢的,我跑n=7的情况,等了N久

1246029/1250000
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2013-3-20 11:04:51 | 显示全部楼层
4# 无心人
也有可能打不到,补充一个链接
http://blog.csdn.net/hehe9737/article/details/7008552
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2013-3-20 12:39:01 | 显示全部楼层
  1. Sum[Boole[i == 58], {i, Total[RandomInteger[{0, 10}, {10^6, 10}], {2}]}]/10.^6 // Timing
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-3-20 16:08:17 | 显示全部楼层
1# chyanog
动态规划:
设p(n,S,m) 表示连续n枪,每枪不超过m环,总成绩为S的概率,则
$p(n,S,m)=\sum_{k=0}^{m}p(n-1,S-k,m)$
其中,
$p(1,S,m) = 1/{m+1},S<=m$
$p(1,S,m) = 0,S>m$
如BeerRabbit 在#5 所示的卷积,很方便
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2013-3-20 17:25:25 | 显示全部楼层
本帖最后由 chyanog 于 2013-3-20 17:28 编辑

5#的代码我翻译了一下,ListConvolve这部分不知道能否再简化一些?


  1. m = n = 10;
  2. x = 58;
  3. A = Table[1/m, {m}]~Join~{0};
  4. a = A;
  5. Do[a = ListConvolve[A, a, -m - 1, 0]~Join~
  6.     Take[ListConvolve[A, a, m + 1, 0], -m], {n - 1}];
  7. a[[m n - x + 1]]
  8. Clear["`*"]

  9. (*ans 16432801/400000000*)
  10. (*0.0410820025*)
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-4-28 22:12 , Processed in 0.060783 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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