1 / N確率


29

単純な課題が十分にないためです。

整数1≤N≤10000が与えられた場合、任意の名前のないプログラムまたは関数を作成し、1 / Nの擬似乱数確率で言語のTrue値を出力します。

命名の要件が削除されたことに注意してください。回答とスコアを適宜編集してください。

一部の言語では、1(または-1)と0とTrueとFalseを使用します。

例:

入力テストの例:

4 -> True
4 -> False
4 -> False
4 -> False
4 -> False
4 -> True
4 -> False
4 -> False

つまり、4が与えられます。25%の確率でTrueを返し、75%の確率でFalseを返します。




すべての言語に「疑似ランダム性」が組み込まれているわけではないため、2番目の引数としてシードを取得することは可能ですか?(例Brainfuck)
flawr

@flawrの使用現在のミリ秒...
アダム

1
Nたちが受け入れなければならない最大のものは何ですか?
トビーSpeight

回答:



15

Pyth、3バイト

!OQ

オンラインで試す

0から入力までのランダムな選択の単純な反転

面白いことに、Pythでは$Pyth関数が自動的にメモされるため、これを行わない関数を作成することはできません。



@LeakyNunああ、私は時間をランダム関数に使うことを忘れていました。それはかなり賢いです。
FryAmTheEggman

いいえ、時間を使ってメモを解除しました。
リーキー修道女

1
私はそれをうまく口に出さなかったと思います:Pそれは、何らかの理由で完全なプログラムよりも優れていた場合、ほとんどの提出物の回避策として実際に機能するとは思わないと言いました。引数として時間を取ることは、おそらくデフォルトでは許可されていません。
FryAmTheEggman

1
@LeakyNunこの質問Qは最後に記入する前のことだと思います!O。そうでなければ答えました;)
FryAmTheEggman

12

CJam、5バイト

これらのものを使って迅速に...

rimr!

ここでテストしてください。

説明

ri e# Read input and convert to integer N.
mr e# Get a uniformly random value in [0 1 ... N-1].
!  e# Logical NOT, turns 0 into 1 and everything else into 0.

11
これらのものを素早く取得する必要があります...」これは、「単純なコードとゴルフのチャレンジが十分ではないという OPに反対する理由です。FGITWが問題である場合、IMOは単純すぎます。
ピーターテイラー

12

TI-BASIC、1バイトトークンを使用した4バイト

not(int(Ansrand

入力の整数部分に[0,1)の乱数を掛けた値がゼロかどうかを判定します。Ansrand<1動作します。


方法...それは4バイトですか?
ジョンドヴォルザーク

3
ない最初のバイトを@JanDvorak(、次は次回答、次のランドであり、(intで一般的には、計算機がないグラフ。れないプログラムのために、それらの内部表現としてASCIIを使用する。
user253751

@immibis一般に、コンピューターもASCIIを使用しません。これは疑わしいかもしれませんが、それについてメタ議論はありますか?
クロルタン

7
@Kroltanはい。これはメタディスカッションであり、これは1バイトのトークンのリストです。これには、使用した4つすべてが含まれます。
リルトシアスト

@ThomasKwaありがとう!
Kroltan

11

MATL、5バイト

これの3つの異なるバージョン、すべて長さ5。

iYr1=

入力(i)を受け取り、1からその数値(Yr)の間のランダムな整数を生成し、それが1(1=)に等しいかどうかを確認します。あるいは、

li/r>

1(l1i現時点でのバグがあるための回避策)を作成し、入力(i)を取得し、1 / N(/)を取得するために分割し、0から1(r)の間の乱数を作成し、数が1 / Nより小さい。または、

ir*1<

入力して(i)、0から1の間の乱数を乗算し(r*)、結果が1より小さいかどうかを確認します(1<)。

MATLではなくMatlabで、この匿名関数を実行できます

@(n)n*rand<1

ans(5)たとえば、12バイトを使用します。



10

ジュリア、17 16 15バイト

n->2>rand(1:n)

これは、1からn2までのランダムな整数を生成し、2未満かどうかをテストする関数です。これが発生する可能性は1 / nであり、したがって1 / nが返される可能性がありtrueます。

Thomas Kwaのおかげで1バイト節約できました!


9

Microscript II、3バイト

NR!

整数を読み取り、と(両端を含む)のn間のランダムな整数を生成し、その値にブール否定を適用します。0n-1


8

キャンディ、2バイト

Hn

HHeisen-doubleの略です

nnotを表します

'n'は、数値入力として-iフラグとともに渡されます。スタックに残っている値は、終了時に出力されます。

"長い形式:

rand   # number between 0 and pop()
not    # cast to int, invert non-zero to zero, and zero to one

-i1バイトとしてカウントする必要があると思います。
リルトシアスト

1
基本的に、数値入力を渡す唯一の方法は-iフラグを使用することです。標準入力から読み込む言語のみが入力仕様のペナルティを受けないのでしょうか?
デールジョンソン

汎用入力フラグがある場合、または引数を渡すために通常のCLAを使用した場合は、間違いなく問題ありません。ただし、データ型が無料で指定されていることは不公平のようです。
リルトシアスト

2
@ThomasKwa動的言語で記述された関数は、ドキュメントで引数が整数であることを指定するためにバイトをカウントする必要がありますか?でlambda x: random.random()<1/x(ungolfed)また、引数が数であることを「自由に指定さ」です。
user253751

@immibisうーん、それは良い点です。それでは、プログラムと機能のルールを同じに保つことでこれが可能になると思います。メタに投稿します。
リスト管理者

7

真剣に、3バイト

,JY

0偽りで1あり、真実です。オンラインで試す

説明:

,JY
,    get input
 J   push a random integer in range(0, input) ([0, ..., input-1])
  Y  logical not: push 0 if truthy else 1  

7

R、30 22バイト

コード

cat(runif(1)<1/scan())          #new
f=function(N)cat(runif(1)<1/N)  #old

均一な分布(0〜1)から数値を生成し、真の1 / n回と評価する必要があります。


6

Japt、6バイト

1>U*Mr

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

MrJSに相当しMath.randomます。残りはかなり明白です。おそらく、0と数値の間のランダムな浮動小数点を生成する数値関数を追加できます。これが発生すると、2バイトが保存されます。

1>Ur    // Doesn't currently work

代替バージョン:

1>Ð %U

Ðはに相当しnew Date(、Dateオブジェクトは、数値への変換を求められると、ミリ秒単位の現在のタイムスタンプになります。したがって、msごとに複数回実行しない限り、これは完全にランダムです。


6

Marbelous、21バイト

}0    # takes one input n
--    # decrements n
??    # random value from range 0..n (inclusive)
=0?0  # push right if not equal to 0, fall through otherwise | convert to zero
++    # increment | no-op
{0//  # output | push left

私が撮影した0falseyすると1Marbelousとして見ては本当に場合は持っていないことには本当の理由がないのに、truthyします。{0trueおよび{>falseの場合、より多くのMarbelousyが出力されます。これは次のようになります。

}0
--
??
=0{>
{0

しかし、それが有効かどうかはわかりません。


これについては、メタディスカッションを行う予定です。私の見解の短いバージョン:別の出力に値を出力することは、別の言語で異なる出力タプルを持つことと同等です。(nil、1)と(1、nil)が別の言語で真実と偽の値になる場合、Marbelousでは{0 vs {>を許可する必要があります。PS:他の出力を埋めることがないため、{>バージョンは終了しません。
スパー

@Sparrは非アクティブのため終了しますか?
オーバーアクター

あなたが正しい。バカだ
スパー

6

APL、6 3バイト

+=?

これは、整数を取り、1または0(APLのtrue / false)を返す関数トレインです。を使用して1から入力までのランダムな整数を生成し?、入力がその整数に等しいかどうかを確認します。その結果、1 /入力の可能性が真になります。

Thomas Kwaのおかげで3バイト節約できました!


@ThomasKwaある種の列車について考えましたが、割り当てられた場合、それは本当に「名前付き関数」としてカウントされますか?「名前のある」部分は非定型だからここに投げられていると思います。
アレックスA.

@ThomasKwa列車(および派生関数)の割り当ては、他のすべての割り当てと完全に並行しています。
アダム

@NBZ並列とはどういう意味ですか?
リルトシアスト

@ThomasKwa Equivalent; 他の機能割り当てのように動作します。
アダム

複素数の共役を意味するため、「+」の代わりに使用し+ます。もちろんここでは重要ではなく+、従来のアイデンティティ(no-op)機能ですが、現在は同じ(同じ)です。スカラーのその他の操作なし:(マテリアライズ)、(ピック)、(囲む)、(分割)、(ミックス)、(一意)、(参加)、,(ラベル)、(テーブル)、(反転)、(反転)最初)、および(転置)。スカラーをベクトルまたは行列に変更するものもあります。
アダム

6

PlatyPar、3バイト

#?!

#?乱数取得する入力です。 それより前の数値の場合はを返し、そうでない場合はを返します。[0,n)n!true0false

この質問が聞かれる前に実装された最新の機能を使用します(ただし、残念ながらコミットしていません)~! 。Tryit onlineで 2に下げることができます


5

Java、43バイト

boolean b(int a){return a*Math.random()<1;}

1
a->a*Math.random()<1短いです。
TheNumberOne

「Java 7以前」を指定する必要があります。
corsiKa

@corsiKlauseHoHoHoこれはかかわらず、同様のJava 8で動作します
SuperJedi224

1
もちろんそうです-しかし、スペースを節約するためにラムダを使用するJava 8には対応していません。そのロジックにより、すべてのJavaの答えはGroovyの答えでもありますが、Javaにはないショートカットがあるため、Groovyは常に同じか小さいです。
corsiKa

5

C、24バイト

f(n){return!(rand()%n);}

OPの編集をロールバックして、最初の4文字を削除しました。バイトを減らすことは良いことですが、私にとっては、を持たないことは構文的に意味をreturnなしf(n)ません。
レベルリバーセント

1
@insertusernamehere rand()%nは、範囲内の乱数を取得する標準的な方法です0..n-1。あなたは正しいです、それはnはるかに小さいことに依存し ていますRAND_MAXn、質問で言及された上限はありません。代替アプローチは、拒否を実行し、nからRAND_MAX までのすべての数値を再ロールしますが、smallでは非効率的nです。
レベルリバーセント

5

> <>、-v = 30バイトの場合は27 + 3

ここに、0または1の15876個のランダムピックの合計をNで修正する、すべてが不均一なソリューションがあります。

0"~":*>:?vr%0=n;
1-$1+$^-1x

Nは-vフラグを使用してスタックに入力する必要があり、出力は偽の場合は0、真実の場合は1です。

代わりに1/2 ^ Nで機能するはるかにスマートで均一なソリューション:

4{:?!v1-}:">"$2p:"x"$3p:"^"$4p1+:">"$3p1+!
   ^1<
0n;
1n;>
 

入力3の場合、1/8の確率で1を獲得し、7/8の確率で0を獲得します。

説明 :

x4行目に必要なだけ追加し、それらを方向で囲みます。そのため、2つの方法しかありませんx:偽出力または次のいずれかxです。すべてxが正しい方向に進むと、最後のものが真実の出力にルーティングされます。

たとえば、N = 5の場合、最終的なコードスペースは次のとおりです。

4{:?!v1-}:">"$2p:"x"$3p:"^"$4p1+:">"$3p1+!
   ^1<
0n; > > > > >
1n;>x>x>x>x>x>
    ^ ^ ^ ^ ^

確かに、任意のNに対して完全な分布を取得することはできませんが、他の誰もPRNGを使用することはできません。xaを数回ループしてランダムビットの束を取得し、それらをint Iにアセンブルしてから、ランダム値としてI%Nを使用できます。
スパー

@Sparrは私の答えを編集しましたが、大量の反復を使用すると結果の整数が「平均化」され、出力が大きくなる傾向があり(iterNum/2)%Nます。低い数値を使用することも解決策とは思いません。私はあなたを完全に理解していなかったのでしょうか、それとも解決策を改善するためのさらなるアイデアがありますか?
アーロン

15000ビットを加算する代わりに、32ビットだけを生成して連結し、均一に分散された32ビットランダム整数を提供します。それをmod。
スパー

@Sparrは、なぜかわからない場合でも、本当に良いようです;)それははるかに多くのバイトを費やします(> <>バイト操作とベース変換のために無駄です)が、私は今晩私の答えを変更します(CEST)。
アーロン

2を掛けて追加することでビットを連結できます。r= 0; for(0..32)r = r * 2 + randbit;
スパー

4

Mathematica、18 16バイト

#RandomReal[]<1&

基本的なソリューション。名前のない人Functionは、[0、1)に乱数を作成し、その引数に乗算し、まだ1より小さいかどうかを確認します。


4

Python、42バイト

import random
lambda n:1>random.random()*n

編集time.time()配布のために答えを削除しました。


2
のためにrandomfrom random import*保存する価値がありますrandom.。しかしではtimeありません。
XNOR

1
モジュロ除算によって生成された乱数は、均一に分布しいません
トランOul

@TrangOulそれは良い点です。より大きなn効果は顕著です。1>time.time()%1*nうまくいくと思う。
リルトシアスト

@TrangOul私はあなたが違いを知っていると推定randCでの、およびtime.timePythonで...後者の1つの明白な機能があることで、それは現在の時刻を返すようには、無制限である、time.time()%n(以上に長い時間の十分な期間を)均一な分布を持っていますのためにn
user253751

4

TeaScript、3バイト

!N×

ここで試してみてください。

説明

 N  maps to Math.rand which is a utility function that returns an integer
    between `arg1` and `arg2` or `0` and `arg1` if only one argument is
    provided.
  × is expanded to `(x)`, where `x` is initialised with the value provided
    in the input boxes; × represents byte '\xd7'
!   negate the result, 0 results in true, anything else false

1
7文字で最大6バイトになりますか?そして、(R)は(シングルバイト)ANSI文字ですか?
アダム

@NBZ、ハハ!私は嘘をついたと思う...二日酔いのせいだ...メカニズムを今気づいたより単純なメカニズムに変更するつもりなので、今すぐ更新する!この現在のバージョンでは、はを®表し、'\xae'1バイトだけです。:)
ドムヘイスティングス

4

ファジーオクトワカモレ、10バイト

^-!_[0]1.|

説明:

^-!_[0]1.|

^          # Get input.
 -         # Decrement, so we can append <ToS> zeros and a 1 to the stack.
  !        # Set loop counter.
   _       # Pop, since we are done with the input.
    [      # Start loop
     0     # Push 0
      ]    # End for loop. We have pushed input-1 0s to the stack.
       1   # Push a single 1 to the stack.
        .  # Switch stacks
         | # Pick a random item from the inactive stack, which has n-1 falsy items and 1 truthy item, so the truthy probability is 1/n.
           # (implicit output)

3

Perl 6の 10の   8バイト

!(^*).pick
#  ^- The * is the argument

このコードは、0から入力を除く範囲を作成します*。次にpick、ランダムに1を!返し、を受け取ったときにTrueを返します0

1>*.rand
# ^- The * is the argument

これは入力*を取得し、0..^1そこからランダムなNumを乗算し、それがより小さい場合にTrueを返します1

# store it in a lexical code variable for ease of use
my &code = 1>*.rand;

die "never dies here" unless code 1;

for ^8 { say code 4 }
False
True
False
False
False
True
False
False

3

プロローグ(SWI)、24バイト

コード:

p(N):-X is 1/N,maybe(X).

maybe(+ P)は確率Pで成功し、確率1-Pで失敗する関数です

例:

p(4).
false

p(4).
false

p(4).
true

3

PowerShell、25バイト

!(Random -ma($args[0]--))

Get-Random機能所与-Maximumパラメータは、n範囲の値を返します[0,n)。inputから1を引くことでこれを活用し、$args[0]適切にゼロインデックスを付けて、ランダムな値を取得します。正確1/nには、この値はになり0、ブール値ではなく!を返すとが返されTrueます。他の時間は戻りFalseます。


3

J、3バイト

0=?

これは、右側の引数を取るモナドフォークです。APLと同様に、?ランダムな整数を生成します。ただし、J配列はゼロベースです。したがって、入力ではなく0と比較します。



3

PHP、22バイト

<?=2>rand(1,$argv[1]);

n次のようなコマンドラインから読み取ります。

$ php probability.php 4

出力falsePHPでは空の文字列にキャストされます)または1(の場合true)。


3

C#、56 45バイト

おかげで、pinkfloydx33は45になりました。

bool b(int n){return new Random().Next(n)<1;}

古い56バイト

0以上nでより小さいランダムな正の整数を生成し、それがより小さいかどうかを確認し、1比較結果を返します。

bool a(int n){Random r=new Random();return r.Next(n)<1;}

1
PPCGへようこそ!残念ながら、この送信は機能しません。なぜならRandom.Next(k)kそのような整数を返すからです0 <= k < n。条件を<1に変更することにより、正しいものになります。さらに、ラムダ式を使用すると、コードが短くなる場合があります。
メゴ

@Mego確かに、コメントありがとうございます。私はそれを作りました0 < k <= n、そして、それはあなたが言ったようであるはずです。すぐに修正します。
ivaan

2
使用するとvar r3回保存されます。または、c#6の場合bool a(int n) => new Random().Next(n)<1;、41の場合。新しいRandomメソッドごとの呼び出しを初期化することは、配布に関して適切に機能するかどうかはわかりませんが。
pinkfloydx33

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