该合作伙伴的目标是评估学生t概率分布的累积分布函数。这并不简单,因为没有封闭形式,而且函数依赖于两个变量v和x。分布函数是

为了获得CDF,您可以将这个函数从-inf集成到x。正如您所看到的,这个函数的计算在很大程度上依赖于积分,因为您还必须计算伽马函数的非平凡值。
您可以编写一个程序或函数,该程序或函数接受两个数字x和v作为输入,其中x是计算of的位置(必须至少接受从-10到10的浮动),v是自由度的数目。v是一个正整数(范围为1到1450),但必须可以将其设置为无穷大(对于v=inf,学生-t分布等于正态分布)。但是您可以指定,例如,v = -1应该表示无穷大。输出必须是0到1之间的数字,并且必须具有至少4位小数点的精度。如果您的语言不支持运行时输入或程序调用中的参数,则可以假设这两个参数都存储在变量(或另一个“内存单元”)中。
你不能使用特殊的函数,比如伽马函数或概率分布函数,以及数值积分函数或库(只要你不把它们的源代码包括在计算分数的代码中)等等。这个想法只是使用基本的数学函数。我试着列一张清单,列出我认为“基本”的内容,但可能还有其他一些我忘记了--如果是的话,请评论一下。
显式允许
+ - / *
% (modulo)
! (factorial for integers only)
&& || xor != e.t.c. (logical operators)
<< >> ^ e.t.c. (bitshift and bitwise operators)
** pow (powerfunction for floats like a^b including sqrt or and other roots)
sin cos tan arcsin arccos arctan arctan2
ln lb log(a,b)
rand() (generating pseudorandom numbers of UNIFORM distribution)最少字节数获胜。
请解释您的代码是如何工作的。请显示至少5个不同参数的程序输出。其中应包括以下三项。对于您自己的值,也请提供“确切”值(如wolframalpha或任何您喜欢的)。
x = 0 v= (any) (should return 0.5000)
x = 3.078 v= 1 (should return 0.9000
x = 2.5 v= 23 (should return 0.9900)如果可能的话,如果你能提供一些用你的程序计算出来的值的花哨图(绘图代码不算分数),那就太好了。
(来自维基百科):

发布于 2014-11-10 23:45:31
下载http://www.bbcbasic.co.uk/bbcwin/bbcwin.html仿真器
a=1s=.000003INPUTx,v
IFv<1v=9999
FORw=1TOv-1a=w/a
NEXTb=SGN(x)*s*a/SQR(v)IFv MOD2b=b/PI ELSEb=b/2
f=.5FORz=0TOABS(x)STEPs
f+=b/(1+z*z/v)^(v/2+.5)NEXTPRINTf代码分为两部分。第一个计算独立于x的系数,并将其存储在b中。这个算法有点像连续分数,但数学家可能会称它为两个乘积的简单商数。它基于问题中维基百科页面中的一个公式,它类似于一个阶乘,但是将产品(v-1)(v-3)...除以产品(v-2)(v-4)...是可能的,因为我们只对伽马函数的半积分值感兴趣(伽马函数的任意值会更难)。使用这个公式,我们不必计算任何一个伽马函数,所以我们避免了大量的数字。最大的中间值大约是v的平方根。
第二个是通过求和从0到x的直接积分。我们知道f(0)是0.5,所以我们从那里开始,然后向外工作。为了能够直接给出最终的答案,在循环之前对b的符号和大小进行了修改。
这包含了一些额外的线条,以增加颜色和绘制数据。x=0到端点的范围为f(x)=0.5至1。此外,v被修改为2^v,使其能够在不超过颜色限制的情况下显示v值的全部范围。为了加快绘制速度,s中的数字比黄金版本少两位。即便如此,与http://www.wolframalpha.com/input/?i=student+t-distribution+probability相比,只有一个差异:0.8130575值高达0.8131。黄金版本给出了正确的答案,(0.8130)对此和所有其他情况下。
a=1 :REM accumulator for gamma series
s=.0001 :REM step size for x integration
INPUTx,v
IFv<1 v=9999 :REM if v<1, set v to a value that gives results indistinguishable from infinity
GCOLv :REM pick a colour
v=2^v :REM for the pretty version, modify v to 2^v
FORw=1TOv-1
a=w/a :REM calculate series as per Wikipedia
NEXT
b=a/SQR(v) :REM divide a by the necessary values...
IFv MOD2 b=b/PI ELSE b=b/2 :REM to give the coefficient, per Wikipedia
b*=SGN(x)*s :REM modify according to sign and step size
f=.5 :REM initialise f(x)=.5 at x=0
FORz=0TO ABS(x) STEPs
f+=b/(1+z*z/v)^(v/2+.5) :REM perform integration as simple "barchart" sum
PLOT69,z*100+200,(f-.5)*1600 :REM plot a point
NEXT
PRINT f

https://codegolf.stackexchange.com/questions/41333
复制相似问题