日期:2014-05-20  浏览次数:20581 次

求一个概率算法,给出算法者立即给分。
1-1000   取一个随机数a
用a做数组b大小,然后每个数组元素用1-1000的随机数填充,然后求数组b之和,1000*1000*0.7为c,问b大于c的概率。

------解决方案--------------------
我不会算概率的方法 在机器上跑了1万次 数组b长度-c 没有大于0的情况。
------解决方案--------------------
楼上算错了

数组b之和-c
不是
数组b长度-c
------解决方案--------------------
a: [1,1000]
b.length: a
b[i]:[1,1000]

当a <=700的,不予考虑,这里有s1 = 1*1+2*1000^2+...+n*1000^n+...+70*1000^70种取法
然后算a> 700的情况,假设有s2种,大于700000的有s3种,
那么结果就是
s3/(s1+s2)

这个东西直接算不现实。必须要用一些小技巧。
下面的回复中,我会说一下这个。


------解决方案--------------------
a数随机,填充数随机,答案随机!!!
------解决方案--------------------
1 数学算法:
定义m=(n-700)*1000, 699 <n <1001

A(n) =1 + n + n^2/2! + n^3/3!…… + n^m/m!;
B(n) = A(n)/1000^n;
C = B(700) + B(701) + …… + B(1000);
D = C / 1000;

D就是结果了

解析:
明显,当n> 699时才有可能
对于每一个n> 699的情况,我们可以看作所有数组都是由最大值(1000)减去一个0至999的随机值取得;所以对于每一个n,满足条件的减去的总数值不能超过m
A(n)是在n个数中,减去不多于m个数的所有的可能情况的个数。而n个数所有的可能情况是1000^n;
所以B(n)是对于单个n 满足条件的概率。而n总共有1000种可能,所以,总的概率是D
------解决方案--------------------
为说明问题,考虑等于1000×1000×0.7情形
数学描述:
假设实验次数为N,数组a[1-1000]每种出现可能性N/1000,理论上N/1000> 1000^i(i为数组a的大小),即N> 1000^1001为最佳测试次数,能够保证遍历所有情形至少一次。

对于a[1]-a[699] 数组之和b> c次数为C[a[i]]=0
a[700] C[a[700]]=1
当i> 700时
计算a[i]之和> c的平均值v,从而保证数组元素a[j](1= <j <=i)取值在v附近,即部分数组元素序列组合之和为v,从而可寻找到满足条件最小集,据此可计算数组C[a[i]];


概率D=(C[a[1]]+C[a[2]]+...+C[a[i]]+...+C[a[1000]])/N

以上只是理论上的,没有实际计算意义。



------解决方案--------------------
补充C[a[i]]包括C[a[i-1....i-2....3.2.1]]特例,要减去这些重复项
------解决方案--------------------

关于概率问题,最直接的办法就是实际计算
通过上万次的计算实验,把符合结果的次数记下来, 概率=实验结果/实验次数。

上面的数据,每次实验产生三个随机数就可以了,写一个10000次的循环,定义一个结果变
量实现累加 ,大概用不了半分钟就ok 了