パレート分布をサンプリングする


22

パレート分布は、自然の中で多くのことをアップしてくる確率分布です。無限平均など、多くの特別なプロパティがあります。この課題では、この分布からサンプリングした数値を出力します。

パレート分布は、すべて1以上のx確率で1/x、以上であると定義されていますx

したがって、この分布からサンプリングされた数値は、確率1で1以上、確率1で2以上、確率1/2で3以上、確率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桁の10進精度で数値を表現でき、最大1,000,000の数値を表現できる必要があります。何か問題がないかわからない場合は、お気軽にお問い合わせください。

これはコードゴルフです。


不正確さに関する詳細:

  • 各範囲のために[a, b]1 <= a < b試料は、その範囲内に入るであろう理想的な確率ということ、です1/a - 1/b。あなたのプログラムがその範囲で番号を生成確率はでなければなりません0.0011/a - 1/bXがプログラムの出力である場合、が必要です|P(a <= X <= b) - (1/a - 1/b)| < 0.001

  • で上記の規則を適用することにより、そのノートa=1b十分に大きい、それはよりプログラムの必須出力数より大きいている場合であるか、または少なくとも確率0.999と1に等しいです。それ以外の時間は、クラッシュしInfinityたり、出力したり、他のことをしたりします。

フォーム1/1-xorの既存の提出物が1/xどこにxあるか、[0, 1)または(0, 1)orのランダムなフロートが[0, 1]すべてこの要件を満たすことは確かです。



2
みんなに注意してください:issacgは不正確さを許すいくつかの規則を追加しました。したがって、ここでのほとんどの答えは必要以上に長くなっています。[申し訳ありませんコメントあまりにも虐待が、ために何が起こるかであるとき、OPチェンジ質問大幅]
user202729

回答:




5

R、10バイト

1/runif(1)

とても簡単です。


2
runif デフォルトでは0または1を返さないため、これに問題はないことに注意してください。
ジュゼッペ

はい、ありがとう。そして、この答えを入力するときに私はそれを考えていませんでしたが、必要であれば実際に分布を確認することができます。
プランナパス

2
間違っている@Mego。パレート分布は完全に連続的であるため、任意の数値に対してメジャー0があります。
テルケル

3
私のため流砂かもしれ@Mego OK、しかし、私は実際の確率ながらだと思います(私は近い浮動小数点について何を知っている与えられた)runif1を与えることがnullの場合、確率1/runif1を与えるためには、理由は浮動小数点精度の、ではありません(つまり、通常1 / 0.9999999はRに1を返します。
plannapus

1
@plannapusうーん...それは良い点です。フロートはこれを完全に複雑にします。
Mego

4

TI-Basic、2バイト

rand^-1      (AB 0C in hex)

不思議な人にはrand、(0,1]にランダムな値を返します。「乱数生成アルゴリズムの仕様により、生成可能な最小数は0よりわずかに大きくなります。可能な最大数は実際には1 ... "(ソース)。たとえば、196164532でrandをシードすると1が得られます。


奇妙なことに、同等のコードはTI-89シリーズの計算機では機能しません。乱数ジェネレーターはほぼ同じように実装されていますが、TI-83 +が0.99999999999889を返すと、TI-89は0を返します。
ミシャラヴロフ

2
TI-Basic開発者は、この課題が発生することを事前に知っていました...?今回は勝つようです。
user202729

@ user202729 0と1を避けるとrand、電卓の他のコマンドのサブルーチンとしてより便利になります。これが、おそらくTIがこの設計決定を下した理由です。たとえば、シード196164532 でrandNorm(0,1返されます。-7.02129...調整なしでRNGアルゴリズムを使用すると、の値が得られます1e99。これは、通常の分布変数が持つには不合理な値です。
ミシャラヴロフ

@ user202729ええ、実際に私はそれをすべて成し遂げるために少し時間旅行しました。これらの賛成票には間違いなく価値があります。
ティムテック

4

R、12バイト

exp(rexp(1))

オンラインでお試しください!

配布を確認する

これが悪用、異なるアプローチをとるということならばY~exp(alpha)、そのX=x_m*e^Yパラメータを持つパレートですx_m,alpha。両方のパラメーターが1であり、デフォルトのレートパラメーターrexpが1であるため、適切なパレート分布になります。

この回答はかなりR固有のアプローチですが、残念ながらplannapusよりもゴルフ性は劣ります。

R、14バイト

1/rbeta(1,1,1)

オンラインでお試しください!

さらにゴルフは少ないが、答えを得る別の方法。

指数分布のもう1つの特性は、if 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

@ user202729それは公平ですが、それに関して懸念を提起している人は少なくともコメントしているでしょうから、ダウンボットは(私の意見では)それに関連しそうにありません。編集:ミステリーdownvoterはdownvoteを削除しました。
ジュゼッペ

このようなチャレンジでRを使用するのは簡単だと思ったので、私はダウン票を投じましたが、私は少し引き金になっていました。私はこれが他のほとんどの答えとは異なる方法を使用していることを認識しているので、私は下票を削除しました。
KSmarts

@KSmarts Rの「些細な」答えは実際には誰も使用していませんでした:actuar::rpareto(1,1,1)長いので:)
plannapus

情報については、がありますベースRでハードコーディングされた20のディストリビューションですが、パレートはそれらの1つではないため、回避策または追加パッケージを使用する必要があります。
プランナパス

3

、10バイト

I∕Xφ²⊕‽Xφ²

オンラインでお試しください!

詳細バージョンへのリンク:

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

コメント:

  • Charcoalには、ランダムな整数を取得するメソッドしかありません。したがって、0〜1のランダムな浮動小数点数を取得するには、0〜Nのランダムな整数を取得し、Nで除算する必要があります。
  • 1/(1-R)式を使用したこの回答の以前のバージョン:この場合、OPは最小値を要求するため、Nは1000000に設定されます。この数値を取得するために、Charcoalはプリセット変数f= 1000を提供しています。したがって、計算f^2するだけで1000000になります。乱数が999999(最大)の場合、1/(1-0.999999)=1000000
  • Neilのヒント(3バイトを節約):1/(1-R/N)where Rが0からNの間の乱数である場合、それはちょうどcomputeと同じN/(N-R)です。しかし、ランダムな整数が発生する確率が同じN-RであるRことを考えると、それは単に計算することと同じですN/RRこの最後のケースでは、0による除算を避けるために1からNまでの数になります)。


@Neilは、あなたのコードが何をするのか理解しようとしている間、しばらくお待ちください... :
チャーリー

実際に私は必要としないMapAssignRight、任意のより多くの10バイトを!動作します。
ニール

コードの@Neil同化が完了しました!回答を編集しました。:-D
チャーリー

3

Haskell61 56バイト

関数randomIO :: IO Floatinterval [0,1)で乱数を生成します。したがって、を使用して変換するx -> 1/(1-x)と、パレート実現が生成されます。

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

オンラインでお試しください!


型注釈を移動すると、数バイトを保存しますrandomIO>>=print.((1::Float)/)
Laikoni

そして、機能が許可されているので、をドロップできると思いますmain=
ライコニ

Appranetly範囲がある[0,1)によると、この答え
flawr

@flawrおっと、あなたは正しい!一時的にフロートがどのように機能するかを忘れていました。
Mego

とにかく、コメントしてくれてありがとう、私には何のアイデアもなかっただろう:)
flawr

3

Excel、9バイト

=1/rand()

はい、Excelは変更に対して(半)競争力があります!


LibreOffice Calcでも動作します:)
ElPedro

これを-1バイトのgoogleシートに変更できます(=1/Rand(
テイラースコット

3

Mathematica、10バイト

1/Random[]

オンラインでお試しください!

M.Sternから-4バイト


2
これは、RandomReal閉じた範囲の実数を出力するため、失敗する可能性があります[0, 1]。したがって、0による除算が可能です。その可能性を取り除くために、ランダムな値を操作する必要があります。
Mego

2
@Megoその情報はどこで見つけたのですか?
J42161217

1
@Megoが0になる確率は?
J42161217

4
Jenny_mathy:メタに関する提案によればthe burden of proof should be on the person claiming to have a valid answer、それが有効であることを証明するのはあなたの仕事であり、@ Megoに無効なテストケースを提供するよう依頼するのではありません。また、floatは離散的であるため、0になる確率はゼロではありません。
user202729

1
トピックに戻って、この関数を使用してゼロになる可能性があるとは思わない。Mathematicaは実際にはより小さい数値を生成します$MinMachineNumber。これを試してくださいTable[RandomReal[{0, $MinMachineNumber}], 100]。Mathematicaは、マシン番号を放棄して任意の精度の数値に切り替えるのに十分スマートであることがわかりました。笑。
ケリーロウダー

2

ルビー、14 8バイト

p 1/rand

取るに足らないプログラムです。短くなるとは思いません。


みんなに注意してください:issacgは不正確さを許すいくつかの規則を追加しました。したがって、ここでのほとんどの答えは必要以上に長くなっています。
user202729

2

Excel VBA、6バイト

VBEイミディエイトウィンドウへの入力と出力を行わない匿名VBEイミディエイトウィンドウ関数

?1/Rnd

1

Python、41バイト

lambda:1/(1-random())
from random import*

オンラインでお試しください!


組み込みの使用は実際には長くなります。

Python、43バイト

lambda:paretovariate(1)
from random import*

オンラインでお試しください!

両方のソリューションは、Python 2とPython 3の両方で機能します。


1
完全なプログラムは、入力を使用せずprint、バイトを保存するタスクの場合に短くなります。
エリックアウトゴルファー




1

Japt、6バイト

1/1-Mr 同じ長さですが、これは少し退屈さを感じませんでした!

°T/aMr

それを試してみてください


説明

インクリメント(°)ゼロ(T)と除算(による/)、その絶対差(a)を有しますMath.random()


みんなに注意してください:issacgは不正確さを許すいくつかの規則を追加しました。したがって、ここでのほとんどの答えは必要以上に長くなっています。
user202729

1

ゼリー、5バイト

Jellyにはランダムフロートもありません。したがって、これはx/nwhere xがrangeのランダムな整数[1, n](両端を含む)を使用してrangeのランダムなfloatをエミュレートします(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の逆数を取る確率がゼロではありません。


EnlistソリューションがØX返されても失敗しませんか0?(免責事項:私はまったく登録を知りません!)
シャギー

@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

1

IBM / Lotus Notesフォーミュラ、13バイト

1/(1-@Random)

サンプル(10回実行)

ここに画像の説明を入力してください


みんなに注意してください:issacgは不正確さを許すいくつかの規則を追加しました。したがって、ここでのほとんどの答えは必要以上に長くなっています。
user202729

ルールの変更が何であれ、これをもっと短くできるかどうかわからない:)
ElPedro


1

JavaScript REPL、15 19バイト

1/Math.random()

3
場合、これは正しい結果が得られませんMath.random() 戻っ0
氏Xcoder

1
たぶん1/(1-Math.random())
user202729

u * 29のソリューションを使用して修正
l4m2

_=>最初にこれを関数にする必要があります。スニペットは許可されていません。
シャギー

コンソールを使用した完全なプログラム
l4m2


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)))))

クリーンは乱数が好きではありません。

ランダムジェネレーター(Mersenne Twister)にシードを与える必要があるため、システムタイムスタンプを使用して、実行ごとに受動的に異なるものを取得する必要があり、IO関連のすべてを行うにはStart、を取得する唯一の場所World

オンラインでお試しください!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.