魔方吧·中文魔方俱乐部
标题:
一道困扰了我很久的题目
[打印本页]
作者:
第8个小笼包
时间:
2009-1-16 01:33:22
标题:
一道困扰了我很久的题目
从1~100这100个整数中任取3个数字,这3个数成等比数列的概率是多少呢?
作者:
方块
时间:
2009-1-16 02:00:18
好像比较复杂...期待答案...
我很费解啊...
作者:
Cielo
时间:
2009-1-16 02:02:22
分母应该是 100C3 吧,然后分子是以下各数的和:
公比是2:首项可以是 1 到 25,——25
公比是3:首项可以是 1 到 11,——11
公比是4:首项可以是 1 到 6,——6
公比是5:首项可以是 1 到 4,——4
公比是6或7:首项可以是 1 到 2,——4
公比是8到10:首项只能是 1 。——3
公比是11或更多:不存在这样的组合。
不知道是不是这样算啊?
[
本帖最后由 Cielo 于 2009-1-16 03:59 编辑
]
作者:
noski
时间:
2009-1-16 03:29:14
用蒙特卡罗方法吧,概率在0.073%附近,不是精确解。
作者:
tyeken8
时间:
2009-1-16 08:09:28
蒙特卡罗算法是一类算法的总称吧?RP类问题解决方法的总称……
有50%以上得到正确结果的算法
作者:
tyeken8
时间:
2009-1-16 08:17:26
105
---------
100C3
int main(_){
int a,b,c;
for(a=0;a<=98;a++)
for(b=a+1;b<=99;b++)
for(c=b+1;c<=100;c++)
if(b*b==a*c) _++;
exit(printf("%d",_-1));
}
作者:
tyeken8
时间:
2009-1-16 08:17:58
6.4935064935064935064935064935065e-4
作者:
tyeken8
时间:
2009-1-16 08:30:25
额……没人鸟我了…………
作者:
noski
时间:
2009-1-16 08:45:30
标题:
回复 6# 的帖子
如果出现1、1、1和2、2、2……这种也算是等比数列的,这样a要从1取到100。
作者:
kexin_xiao
时间:
2009-1-16 09:03:50
4楼能公布一下具体的方法吗?我想学习一下,谢谢
作者:
noski
时间:
2009-1-16 09:24:28
标题:
回复 10# 的帖子
这是一种用计算机产生随机数模拟事件发生的数值算法。
每次取三个1-100的随机数,检验它们是否是等比数列。
这样取相当多次之后,比如100万次,结果的概率就会相当接近于理论值。
作者:
noski
时间:
2009-1-16 10:11:04
呵呵,判断了N多条件,算出了精确解,就是0.073%。
计算方法:
第一步,计算有多少种可能组合,算上1 1 1这种相同数的,共有205种情况。如果不算是105种。
第二步,对于1-100的每一个数字N,在205种情况中查找包含N的组合数M。比如:
when N = 2
1 2 4
2 2 2
2 4 8
2 6 18
2 8 32
2 10 50
2 12 72
2 14 98
Total: M = 8
第三步,根据1-100的每个M值,计算概率。
P = ∑ ( (2 * Mi - 1) / 1000000 )
(i=1~100)
也就是说,取第一个数的概率是1%;取了第一个数之后,只有2M-1种可能取第二个数,概率是(2M-1)*1%;第三个数为1%(注:类似取2 4 1 和2 4 8这样的情况已算在第二个数中了)。由此得最后结果0.073%。
即,依次取三个数的100*100*100种可能性中,成等比数列的情况有730种。
如果不允许1 1 1这样的情况出现,那么可能情况数减100,为630种,分子成为100*99*98,结果为0.0649%。结果和7楼一样。
[
本帖最后由 noski 于 2009-1-16 10:43 编辑
]
作者:
beijiaoff
时间:
2009-1-16 10:28:29
感觉这个没什么难度啊。。c罗说的不对么
作者:
第8个小笼包
时间:
2009-1-16 11:35:06
标题:
回复 12# 的帖子
不算公比为1的情况,的确是105种,但是这个结论能推广到N个数吗?
作者:
tyeken8
时间:
2009-1-16 12:10:22
如果算111和222那么分母就不是100C3而是100^3
作者:
tyeken8
时间:
2009-1-16 12:26:44
有多项式算法为什么要用蒙特卡罗算法?
作者:
shenheng
时间:
2009-1-16 14:15:02
标题:
回复 6# 的帖子
回: tyeken8
再写复杂一点的话,就可以去参加IOCCC大赛了,呵呵。a、b、c的取值范围还有很大的优化空间呢,如果三个值均不相同的话,a的最大值应该少于等于100/2/2=25吧,计算速度至少快几倍了。
int main(_){
int a,b,c;
for(a=0;a<=98;a++)
for(b=a+1;b<=99;b++)
for(c=b+1;c<=100;c++)
if(b*b==a*c) _++;
exit(printf("%d",_-1));
}
[
本帖最后由 shenheng 于 2009-1-16 14:18 编辑
]
作者:
R'cube
时间:
2009-1-16 14:36:44
我的解答,这个就不水了
附件:
解答.rar
(2009-1-16 14:36:44, 5.69 KB) / 下载次数 1
http://bbs.mf8-china.com/forum.php?mod=attachment&aid=MzU4NDV8OGUwNzBjYTB8MTc0MDc2MDE4M3wwfDA%3D
作者:
tyeken8
时间:
2009-1-16 17:00:53
额,今天早上一边吃饭一边写的点东西而已,一点优化都没有,想写更短的也不是做不到的
作者:
cyz
时间:
2009-1-16 17:14:50
都是很复杂的…………好痛苦 啊………………
作者:
ursace
时间:
2009-1-17 02:03:35
100个数中取3个,不说能否重复则显然为不能重复
作者:
R'cube
时间:
2009-1-17 02:45:02
其实真的是很简单的一道题啊
纯高中知识
欢迎光临 魔方吧·中文魔方俱乐部 (http://bbs.mf8-china.com/)
Powered by Discuz! X2