采样帕累托分布


22

Pareto分布是出现了很多自然的概率分布。它具有许多特殊属性,例如无穷均值。在此挑战中,您将输出从此分布中采样的数字。

对于所有大于或等于1 的Pareto分布,均被定义为大于或等于x概率。1/xx

因此,从此分布采样的数字的概率为1,大于或等于1,概率为1/2的情况下,大于或等于2;概率为1/3,大于或等于的情况下,大于或等于3 11.4的概率恰好为1 / 11.4,依此类推。

由于将对这种分布进行采样,因此程序或函数将不输入任何内容,而是输出具有上述概率的随机数。但是,如果您的程序由于浮点数印象而不能完全匹配上述概率,那就可以了。有关更多详细信息,请参见挑战的底部。

(确切地说,这称为阿尔法为1且下界为1的帕累托分布)

这是从此分布中提取的10个示例:

1.1540029602790338
52.86156818209856
3.003306506971116
1.4875532217142287
1.3604286212876546
57.5263129600285
1.3139866916055676
20.25125817471419
2.8105749663695208
1.1528212409680156

请注意,其中有5个低于2,有5个高于2。由于这是平均结果,因此当然可以更高或更低。

您的答案仅需在浮点类型,实数类型或您使用的任何其他类型的限制范围内是正确的,但您必须能够表示至少3个十进制精度的数字,并且最多可表示1,000,000个数字。如果不确定是否可以,请随时询问。

这是代码高尔夫。


有关不精确度的详细信息:

  • 对于每个范围[a, b]1 <= a < b样本落入该范围的理想概率为1/a - 1/b。您的程序产生该范围内的数字的概率必须0.0011/a - 1/b。如果X是程序的输出,则要求|P(a <= X <= b) - (1/a - 1/b)| < 0.001

  • 请注意,通过使用a=1b足够大的上述规则,可能是您的程序必须以至少0.999的概率输出大于或等于1的数字。其余时间它可能会崩溃,输出Infinity或执行其他任何操作。

我可以肯定地说,形式为1/1-x或的现有提交(1/x其中或或x随机浮动)都满足此要求。[0, 1)(0, 1)[0, 1]



2
所有人注意:issacg添加了一些允许不精确的规则,因此,此处的大多数答案都超过了必要的时间。[也很抱歉滥用评论,但是当OP更改问题显着时,会发生这种情况]
user202729

Answers:




5

R,10个字节

1/runif(1)

非常简单。


2
请注意,runif 在默认情况下永不返回0或1,因此这没有问题。
朱塞佩

是啊谢谢。在输入此答案时,我没有想到它,但是您确实可以根据需要验证分布
plannapus

2
@Mego不正确。帕累托分布绝对是连续的,因此对于任何数字,其度量均为0。
Therkel '17

3
@Mego OK,对我来说可能是流沙(如果我对浮点数几乎一无所知),但我实际上认为,由于浮点数的准确性,给出1 runif的可能性为零,给出1的可能性1/runif却不为(即通常1 / 0.9999999返回1(R)。
plannapus

1
@plannapus嗯...很好。浮点数使这完全太复杂了。
Mego

4

TI基本,2字节

rand^-1      (AB 0C in hex)

对于任何想知道的人,都rand将在(0,1]中返回一个随机值。“由于随机数生成算法的特殊性,可能生成的最小数字略大于0。实际上最大的数字可能是1 ... “(来源)。例如,以兰特196164532播种的兰德收益为1。


奇怪的是,等效代码在TI-89系列计算器上不起作用。尽管他们的随机数发生器几乎相同的实现,一个TI-89将返回0每当TI-83 +将返回0.99999999999889。
Misha Lavrov

2
TI基础开发人员提前知道了这一挑战将会发生...?这次似乎赢了。
user202729 '17

@ user202729避免使用0和1 rand作为计算器其他命令的子例程更为有用,这可能就是TI做出此设计决定的原因。例如,randNorm(0,1返回-7.02129...种子196164532。使用RNG算法而不进行调整将得出的值1e99,对于正态分布的变量而言,这是不合理的值。
Misha Lavrov

@ user202729是的,实际上我只是花了一点时间才能完成所有工作。这些票绝对值得。
Timtech '17

4

R,12个字节

exp(rexp(1))

在线尝试!

验证分布

这采用了另一种方法,利用 if Y~exp(alpha),then X=x_m*e^Y是带有参数的Pareto 的事实x_m,alpha。由于两个参数均为1,并且默认的rate参数为rexp1,因此这会导致适当的Pareto分布。

虽然这个答案是相当特定于R的方法,但可悲的是,它比Plannapus的高尔夫风格少。

R,14个字节

1/rbeta(1,1,1)

在线尝试!

更少的打高尔夫球,而是获得答案的另一种方式。

指数分布的另一个特性是,如果X ~ Exp(λ) then e^−X ~ Beta(λ, 1)1/Beta(1,1)则为Pareto(1,1)

此外,敏锐的观察者会记得,如果X ~ Beta(a,b)a=b=1,那么X~Unif(0,1)这确实是1/runif(1)


我不知道。但是现实是,在此挑战上,什么是允许的,什么不是可以允许的,这是一个巨大的困惑。
user202729 '17

@ user202729这很公平,但是那些对此一直表示担忧的人至少会发表评论,因此(我认为)不赞成票与这一点无关。编辑:神秘的降票者已经删除了降票者。
朱塞佩

我之所以投票,是因为我认为在这样的挑战中使用R是微不足道的,但是我有点发自内心的高兴。我意识到这与大多数其他答案使用的方法不同,因此我删除了我的否决票。
KSmarts '17

@KSmarts R中的“平凡”答案实际上并没有被任何人使用:actuar::rpareto(1,1,1),因为它更长:)
plannapus

有关信息,请参见在R中硬编码了20个发行版,但Pareto并不是其中之一,因此需要使用替代方法或附加软件包。
plannapus

3

木炭,10字节

I∕Xφ²⊕‽Xφ²

在线尝试!

链接是详细版本:

Print(Cast(Divide(Power(f, 2), ++(Random(Power(f, 2))))));

评论:

  • 木炭仅具有获取随机整数的方法,因此,要获取0到1之间的随机浮点数,我们必须获取0到N之间的随机整数并除以N。
  • 该答案的先前版本使用1/(1-R)公式:在这种情况下,由于OP要求将N设置为最小值,因此将N设置为1000000。为了获得该数字,木炭提供了一个预设变量f= 1000。因此,仅计算f^2得出1000000。如果随机数是999999(最大值),则1/(1-0.999999)=1000000
  • 尼尔的技巧(节省3个字节):如果我的1/(1-R/N)where R是0到N之间的随机数,则它与计算相同N/(N-R)。但是考虑到随机整数N-RR发生的可能性相同,这与只是计算N/RR在最后一种情况下,为1到N之间的数字(包括0和N)以避免被零除)相同。


@Neil,请稍等,我尝试了解您的代码的作用... :-)
Charlie

其实我不需要MapAssignRight任何更多的,10个字节!作品。
尼尔,

您的代码的@Neil同化完成!答案已编辑。:-D
查理

3

Haskell61 56字节

该函数在时间间隔内randomIO :: IO Float生成随机数,因此使用对其进行转换将产生pareto实现。 [0,1)x -> 1/(1-x)

import System.Random
randomIO>>=print.(1/).((1::Float)-)

在线尝试!


移动类型注释可节省一些字节:randomIO>>=print.((1::Float)/)
Laikoni

随着功能的允许,我会说您可以删除main=
Laikoni '17

适当的范围是[0,1)根据此答案
瑕疵

@flawr糟糕,您是对的!我忘了花车是如何临时工作的。
Mego

好吧,无论如何,感谢您的评论,我不会有任何想法:)
瑕疵的

3

Excel,9个字节

=1/rand()

是的,Excel具有(半)竞争优势!


也可在LibreOffice Calc中使用:)
ElPedro

您可以将其更改为Google表格-1字节(=1/Rand(
泰勒·斯科特

3

Mathematica,10个字节

1/Random[]

在线尝试!

来自M.Stern的-4个字节


2
这有可能失败,因为RandomReal在封闭范围内输出实数[0, 1]。因此,除以0是可能的。您需要操纵随机值以消除这种可能性。
Mego

2
@Mego您到底在哪里找到该信息?
J42161217 '17

1
@Mego获得0的概率是多少?
J42161217

4
Jenny_mathy:根据有关meta 的建议the burden of proof should be on the person claiming to have a valid answer-您的工作是证明它是有效的,而不是要求@Mego提供无效的测试用例。同样因为float是离散的,所以获得0的概率不为零。
user202729 '17

1
回到主题,我相信使用此函数不可能将其设置为零。Mathematica实际上产生的数字少于$MinMachineNumber。试试这个:Table[RandomReal[{0, $MinMachineNumber}], 100]。事实证明,Mathematica足够聪明,可以放弃机器编号并切换到任意精度的编号。大声笑。
凯莉·洛德

2

Ruby,14个 8字节

p 1/rand

琐碎的程序,我认为它不会变得更短。


所有人注意:issacg添加了一些允许不精确的规则,因此,此处的大多数答案都超过了必要的时间。
user202729 '17

2

Excel VBA,6字节

匿名VBE立即窗口功能,无需输入即可输出到VBE立即窗口

?1/Rnd





1

Japt,6个字节

1/1-Mr 的长度是一样的,但是觉得没那么无聊!

°T/aMr

试试吧


说明

递增(°)零(T)并用乘以(/)其绝对差(aMath.random()


所有人注意:issacg添加了一些允许不精确的规则,因此,此处的大多数答案都超过了必要的时间。
user202729 '17

1

果冻,5个字节

Jelly也没有随机浮点数,因此它使用x/nwhere x是range [1, n](含)范围内的随机整数(含)来模拟range的随机浮点数(0, 1]。在此程序n中设置为。108

ȷ8µ÷X

在线尝试!

说明

ȷ8     Literal 10^8.
  µ    New monad.
   ÷   Divide by
    X  random integer.

征募,3个字节

ØXİ

在线尝试!

争取击败果冻!(TI-Basic还没有)

说明

  İ    The inverse of...
ØX     a random float in [0, 1)

当然,这具有非零概率取0的倒数。


如果ØX返回,Enlist解决方案不会失败0吗?(免责声明:我一点都不了解征募!)
Shaggy

@Shaggy your program must output a number greater than or equal to 1 with at least probability 0.999. The rest of the time it may crash(来自挑战规则)
user202729 '17

1

IBM / Lotus Notes公式,13个字节

1/(1-@Random)

样品(10次)

在此处输入图片说明


所有人注意:issacg添加了一些允许不精确的规则,因此,此处的大多数答案都超过了必要的时间。
user202729 '17

不知道无论进行了什么规则更改,我都可以将它缩短很多:)
ElPedro




0

J,9字节

p=:%@?@0:

我无法弄清楚如何使其不接受任何输入,因为p =:%?0将立即求值并保持固定。因此,它的时间很长。

怎么运行的:

p=:        | Define the verb p
       0:  | Constant function. Returns 0 regardless of input.
     ?@    | When applied to 0, returns a random float in the range (0,1)
   %@      | Reciprocal

评估了20次:

    p"0 i.20
1.27056 1.86233 1.05387 16.8991 5.77882 3.42535 12.8681 17.4852 2.09133 1.82233 2.28139 1.58133 1.79701 1.09794 1.18695 1.07028 3.38721 2.88339 2.06632 2.0793


0

干净,91字节

import StdEnv,Math.Random,System.Time
Start w=1.0/(1.0-hd(genRandReal(toInt(fst(time w)))))

清理不喜欢随机数。

因为随机数发生器(梅森倍捻机)需要给予种子,我必须采取系统的时间戳来得到的东西,不同于被动每跑,做任何事情IO有关我不需要使用整个Start声明,因为它是获得的唯一地方World

在线尝试!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.