chyanog 发表于 2013-3-20 00:08:26

打靶

一运动员打靶,靶一共10环, 求打10枪后总成绩58环的可能。
下面的代码内存不够Join @@ (Permutations /@ IntegerPartitions]) //Length // Timing

chyanog 发表于 2013-3-20 00:12:10

不知道Mathematica的Probability函数能不算这道题

无心人 发表于 2013-3-20 09:14:22

缺少分析数据的
比如该运动员平均成绩

无心人 发表于 2013-3-20 09:14:34

你不能从0-10随机的

BeerRabbit 发表于 2013-3-20 09:36:19

1# chyanog

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

wayne 发表于 2013-3-20 09:53:04

楼主例子给的不太对,简单的说,就是十个均匀【1,,10】的随机数和小于58的概率是多少。xx=x/@Range;Probability<=58,Distributed[#,DiscreteUniformDistribution[{1,10}]]&/@xx]用Probability也很慢的,我跑n=7的情况,等了N久

1246029/1250000

chyanog 发表于 2013-3-20 11:04:51

4# 无心人
也有可能打不到,补充一个链接
http://blog.csdn.net/hehe9737/article/details/7008552

chyanog 发表于 2013-3-20 12:39:01

Sum, {i, Total, {2}]}]/10.^6 // Timing

wayne 发表于 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 所示的卷积,很方便

chyanog 发表于 2013-3-20 17:25:25

本帖最后由 chyanog 于 2013-3-20 17:28 编辑

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

m = n = 10;
x = 58;
A = Table~Join~{0};
a = A;
Do~Join~
    Take, -m], {n - 1}];
a[]
Clear["`*"]

(*ans 16432801/400000000*)
(*0.0410820025*)
页: [1] 2
查看完整版本: 打靶