デイ7のランダムゴルフ:明らかにランダムなキャラクター


47

シリーズについて

これは、ランダムゴルフオブザデイシリーズのゲストエントリです。

まず、これを他のコードゴルフチャレンジと同様に扱い、シリーズについてまったく心配することなく答えることができます。ただし、すべての課題にリーダーボードがあります。リーダーボードは、最初の投稿でシリーズに関する詳細情報とともに見つけることができます。

入力

入力は行われません。

出力

オプションの末尾の改行を含むアルファベットの1文字(大文字と小文字は無関係)。各文字には、選択される確率がゼロ以外である必要があり、26の確率すべてが明確でなければなりません。すべてのあいまいさを削除するには:明確とは、互いに等しい2つの確率が存在してはならないことを意味します。

得点

これはコードゴルフです。バイト単位の最短コードが優先されます。

有効なエントリは、終了しない確率がゼロの完全なプログラムまたは機能です。

アルファベット

混乱を避けるため、使用される特定のアルファベットはラテンアルファベットです。

どちらか

ABCDEFGHIJKLMNOPQRSTUVWXYZ

または

abcdefghijklmnopqrstuvwxyz

大文字または小文字を出力することを選択できます。または、それが役立つ場合は、異なる実行で異なるケースを出力することを選択できます。与えられた文字の確率は、どちらの場合でもその文字が現れる確率(上または下)です。

説明

出力からはまったく明らかではないので、26の異なる確率をどのように達成したかを明確に説明してください。

リーダーボード

ここから)

シリーズの最初の投稿は、総合リーダーボードも生成します。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、すべての回答を見出しで開始してください。

## Language Name, N bytes

N提出物のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

## Ruby, <s>104</s> <s>101</s> 96 bytes

(言語は現在表示されていませんが、スニペットはそれを必要とし、解析します。将来、言語ごとのリーダーボードを追加する可能性があります。)


26の異なる確率をどのように測定しますか?プログラムを26回実行することで?
あなた

1
@YOUは解決策を確認します-優れた説明を持つ
いくつかの

関数の場合、印刷する必要がありますか、それとも文字値を返すだけですか?
ジェフリーディ

@Geoff inputおよびoutputのデフォルトに従って、STDOUTに出力するか、文字を返すことは問題ありません。
-trichoplax

@Geoffは、それを表す単なる数値ではなく、文字でなければならないことに注意してください。たとえば、Aではなく65
-trichoplax

回答:


13

Pyth、5

Os._G

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

アルファベットのプレフィックスを計算します["a", "ab", "abc", ..., "abcdefghijklmnopqrstuvwxyz"]。次に、リストをフラット化し、そこから一様にランダムな要素を選択します。これは、a26回b表示されますが、25回表示されz、1 回しか表示されないため、各文字が表示される可能性はそれぞれ異なります。合計文字列は351文字です。


1
私はその答えが好きです。非常に賢い。
アレンフィッシャー

24

MATL、6文字

1Y2Xr)

説明:

Xr正規分布する乱数乗り )インデックスに使用これをに... 1Y2アルファベット

分布は0を中心に対称であり、数値のcharへの変換は0.5を中心に対称です。そのため、確率は明確でなければなりません。


2
ああ、ガウス分布を使用することをお勧めします!
ルイスメンドー

1
仕事のための「最高の」言語であり、まだゼリーにbeatられています。しかし、優れたソリューション。
ソクラティックフェニックス

19

05AB1E、6バイト

コード

A.pJ.R

説明

A        # Pushes the alphabet
 .p      # Computes all prefixes
   J     # Join them together

現在、次の文字列があります。

aababcabcdabcdeabcdefabcdefgabcdefghabcdefghiabcdefghijabcdefghijkabcdefghijklabcdefghijklmabcdefghijklmnabcdefghijklmnoabcdefghijklmnopabcdefghijklmnopqabcdefghijklmnopqrabcdefghijklmnopqrsabcdefghijklmnopqrstabcdefghijklmnopqrstuabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvwabcdefghijklmnopqrstuvwxabcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyz

その後、を使用してランダムな要素を選択し.Rます。

確率

a > 7.4074074074074066%
b > 7.122507122507122%
c > 6.837606837606838%
d > 6.552706552706553%
e > 6.267806267806268%
f > 5.982905982905983%
g > 5.698005698005698%
h > 5.413105413105414%
i > 5.128205128205128%
j > 4.843304843304843%
k > 4.5584045584045585%
l > 4.273504273504274%
m > 3.988603988603989%
n > 3.7037037037037033%
o > 3.418803418803419%
p > 3.133903133903134%
q > 2.849002849002849%
r > 2.564102564102564%
s > 2.2792022792022792%
t > 1.9943019943019944%
u > 1.7094017094017095%
v > 1.4245014245014245%
w > 1.1396011396011396%
x > 0.8547008547008548%
y > 0.5698005698005698%
z > 0.2849002849002849%

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


18

ゼリー、5 バイト

ØA»ẊX

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

使い方

ØA«ẊX  Main link. No arguments.

ØA     Set argument and return value to the alphabet.
   Ẋ   Shuffle it.
  »    Yield the maximum of each letter in the sorted alphabet, and the
       corresponding character in the shuffled one.
    X  Pseudo-randomly select a letter of the resulting array.

バックグラウンド

してみましょうL 0、...、L 25は、その自然な順序でアルファベットの文字を表し、S 0、...、S 25のランダム選択された順列で均一にLM n = max(L n、S nによって有限シーケンスMを定義します。

n0、…25に修正し、L n = S kになるようにkをインデックスとして定義します。

確率で1月26日L N = S 、N及びN = Kので、M 、N = L N及びL N occurrsで一度M

確率26分の25L N ≠S 、N及びN≠K 。この場合、次のことが起こります。

  • 確率n / 25では、S nL 0、…、L n-1のいずれかであるため、L n > S nおよびM n = L nです。

  • 独立して、確率n / 25でもk0、…n-1のいずれかであるため、S k > L kおよびM k = S k = L nです。

したがって、予想の発生数L NMがある1/26 + 25/26・(N / 25 + N / 25)=(2N + 1)/ 26

最後に、Mのmをランダムに一様に選択すると、文字L nは確率(2n + 1)/ 26/26 =(2n + 1)/ 676で選択されます。

これにより、次の確率分布が得られます。

p(m = A) =  1/676 ≈ 0.00148
p(m = B) =  3/676 ≈ 0.00444
p(m = C) =  5/676 ≈ 0.00740
p(m = D) =  7/676 ≈ 0.01036
p(m = E) =  9/676 ≈ 0.01331
p(m = F) = 11/676 ≈ 0.01627
p(m = G) = 13/676 ≈ 0.01923
p(m = H) = 15/676 ≈ 0.02219
p(m = I) = 17/676 ≈ 0.02515
p(m = J) = 19/676 ≈ 0.02811
p(m = K) = 21/676 ≈ 0.03107
p(m = L) = 23/676 ≈ 0.03402
p(m = M) = 25/676 ≈ 0.03698
p(m = N) = 27/676 ≈ 0.03994
p(m = O) = 29/676 ≈ 0.04290
p(m = P) = 31/676 ≈ 0.04586
p(m = Q) = 33/676 ≈ 0.04882
p(m = R) = 35/676 ≈ 0.05178
p(m = S) = 37/676 ≈ 0.05473
p(m = T) = 39/676 ≈ 0.05769
p(m = U) = 41/676 ≈ 0.06065
p(m = V) = 43/676 ≈ 0.06361
p(m = W) = 45/676 ≈ 0.06657
p(m = X) = 47/676 ≈ 0.06953
p(m = Y) = 49/676 ≈ 0.07249
p(m = Z) = 51/676 ≈ 0.07544

リンクを100,000回呼び出すことにより、分布を経験的に検証できます(数秒かかります)。


1
@RobertFraserシャッフルアンドイールドステップは、Aがいずれかのリストに出現するA、Bがいずれかのリストに出現するB、およびAが他のリストに存在するAを含むリストを生成します。両方のリストに登場しました。そのため、結果にはZの約52倍のAがあります。
スパー

1
@RobertFraser説明を追加しました。
デニス

2
@DennisJaheruddin UTF-8では、はい。ただし、Jellyは、理解しているすべての文字をそれぞれ1バイトとしてエンコードするカスタムコードページを使用します。ヘッダーのバイトリンクはそれを指します。
デニス

2
説明を読んだときに、通常のUTF-8の範囲も利用できないことはすぐにはわかりませんでした。したがって、インタープリターを変更し、すべての文字を個別のUTF-8文字にマッピングすると、完全に同一のコード(読みにくい/入力しにくい)になると思いますか?-その場合、説明を拡張して、ゴルフの目的のために1バイトを1カウントとしてカウントすることを検討してください。
デニスジャヘルディン

2
@DennisJaheruddin README(ヘッダーの最初のリンク)で説明されているように、インタープリターには2つのモード(JellyコードページとUTF-8)があるため、このプログラムを実際の5バイトファイルに保存できます。書いたすべての回答にその情報をすべて追加できましたが、何百もの回答があるため、代わりにリンクを選択しました。
デニス

14

MATL、10バイト

1Y2rU26*k)

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

このコードは、区間(0,1)(r)で一様なランダム変数を生成し、その平方(U)を計算します。これにより、確率密度が不均一になります。26(26*)を乗算すると、結果が間隔(0,26)になり、切り捨て(k)により、確率が減少する値0,1、...、25が生成されます。値は)、大文字のアルファベット(1Y2)のインデックス()として使用されます。MATLは1ベースのモジュラーインデックスを使用するため、0はZ、1はA、2はBなどに対応します。

確率が異なることを示す例として、1000000のランダムな実現から得られる離散ヒストグラムを示します。グラフは、Matlabでこれを実行して生成されます。

bar(0:25, histc(floor(26*rand(1,1e6).^2), 0:25))

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


1
いいね!私が思いつく最良の解決策は16バイトです
DJMcMayhem

1
@DJMcMayhem素敵なアプローチ!
ルイスメンドー

たぶん、しかしもっと長い。:P
DJMcMayhem

もう一つの楽しみの選択肢:matl.suever.net/...
Suever


13

Java 7、62 57 56バイト

Pokeのおかげで5バイト。

trichoplaxのおかげで1バイト。

char r(){return(char)(65+(int)Math.sqrt(Math.random()*676));}
char r(){return(char)(65+Math.sqrt(Math.random()*676));}
char r(){return(char)(65+Math.sqrt(Math.random())*26);}

できた!

周波数図(1e6実行、スケーリング係数1/1000)

A: *
B: ****
C: *******
D: **********
E: *************
F: ****************
G: *******************
H: **********************
I: *************************
J: ***************************
K: ******************************
L: **********************************
M: ************************************
N: ***************************************
O: *******************************************
P: *********************************************
Q: ************************************************
R: ***************************************************
S: ******************************************************
T: *********************************************************
U: ************************************************************
V: ***************************************************************
W: ******************************************************************
X: *********************************************************************
Y: ************************************************************************
Z: ***************************************************************************

1
intに型キャストする必要はないと思う
ポケ

@Pokeありがとう、ゴルフ。
リーキー修道女

676を括弧の外側に移動して、バイトを節約できますか?
-trichoplax

@trichoplaxどういう意味ですか?
リーキー修道女

2
sqrt(x*y*y) = sqrt(x)*y
-trichoplax

10

Perl、24バイト

@Martin Enderのおかげで-4バイト
@Dom Hastingsのおかげで-1バイト

say+(A..Z)[rand rand 26]

-M5.010または-E実行する必要があります:

perl -E 'say+(A..Z)[rand rand 26]'

次のコードを実行すると、各文字の出現が表示されます。

perl -MData::Printer -E '$h{(A..Z)[rand rand 26]}++ for 1 .. 1_000_000;$h{$_} = int($h{$_} / 100) / 100 for A .. Z;p %h;'
A 16.4
B 11.02
C 8.99
...
Z 0.07


どのように動作します:私は、コードはかなり明示的であると思いますが、それでも:それは間の乱数を選択する0rand 26。そのため、0(文字A)に近い数字が選択される確率がはるかに高くなります。


説明は私にとって理にかなっています:)
trichoplax

いい解決策!あなたは裸のリストを使用して1つのバイトを保存し、+することができますsay+(A..Z)[rand rand 26]
ドムヘイスティングス

@DomHastings aarf、私は愚かだ。私は試しまし(A..Z)[...]たがうまくいきませんでしたので、そのような匿名配列を使用できると思いましたが、それはちょうどsay..ありがとう!:)
ダダ

10

PHP、44 36 29 27バイト

取り消し線44は、まだ規則的な44です;(

insertusernamehere、Petah、およびCryptoのすべての助けに感謝します

<?=chr(65+rand(0,675)**.5);

0から675(= 26 2 -1)の間の乱数を選択し、その平方根を取り、それをフロアします(chr関数は引数を整数に変換します)。正方形の間隔は異なるため、選択される各数値の確率は異なります。すべてのnは、確率(2n + 1)/ 676で選択されます。

この数値に65を追加すると、からのランダムな文字が得AられZます。

1,000,000回実行されるコードのアイデア


4バイトのゴルフができますrange(A,Z)
insertusernamehere

@insertusernamehere:ヒントをありがとう。ただし、範囲をまったく使用せず、を使用するだけで8バイトをゴルフできましたchr()
ビジネス猫

3
さらに良い。残念ながら、取り消し線44はまだ通常の44です。:)
ユーザー名をここに挿入します

1
@insertusernamehereあなたは簡単にgiveめます:<s>&nbsp;44&nbsp;</s>
MonkeyZeus

<?=chr(65+sqrt(rand(0,675)));
ペタ

8

R、40 27バイト

LETTERS[sample(26,1,,1:26)]

これは、に向かって増加する確率で生成された1番号から26番号を取得しZ、置換せずに、大文字のリストからこの番号をインデックスとする文字を表示しますLETTERS

sample関数の引数は次のとおりです。

sample(
       26, #How many numbers to generate
        1, #How many numbers to sample
         , #Replacing ? Here, no by default
     1:26, #Weight of probabilities
       )

うん、それは動作しません。賢い方法があるかもしれません!
フレデリック

さて、どこかに常に裏地があります!考えてみ
フレデリック

1
修正済み短い-印象的:)
trichoplax

1
@trichoplaxありがとう!ナイスチャレンジところで!
フレデリック

1
@AlbertMasclans:それは確かにできますが、他の誰かの答えですでに行われているので、「コピー」したくありません!どっちにしても、ありがとうね !;)
フレデリック

8

> <>、14バイト

lx
;>dd+%'A'+o

> <>はトロイダル2D言語であり、言語の唯一のランダム性の原因により、明確な確率の部分が自然に発生します。オンラインでお試しください!

関連するコマンドは次のとおりです。

[Row 1]
l          Push length of stack
x          Change the instruction pointer direction to one of up/down/left/right
           This gives a 50/50 chance of continuing on the first row (moving
           left/right) or going to the next row (moving up/down, wrapping if up)

[Row 2]
>          Change IP direction to right
dd+%       Take top of stack mod 26 (dd+ = 13+13 = 26)
'A'+       Add 65
o          Output as character
;          Halt

したがって、出力の確率は次のとおりです。

A:  1/2^1  + 1/2^27 + 1/2^53 + ... = 33554432 / 67108863 ~ 0.50000000745
B:  1/2^2  + 1/2^28 + 1/2^54 + ... = half of chance for A
C:  1/2^3  + 1/2^29 + 1/2^55 + ... = half of chance for B
...
Z:  1/2^26 + 1/2^52 + 1/2^78 + ... = half of chance for Y

7

Pythonの2、58の 57バイト

from random import*
print chr(int(65+(random()*676)**.5))

説明:これは、間隔[0, 676)でランダムな浮動小数点数を生成し、平方根を取得してからフロア化します。次に、65(「A」のASCII値)を追加し、charに変換して出力します。

これにより、0〜25の各数値に個別の確率が与えられます。理由を理解するには、このように考えてください。平方根と床を0にすると、非整数を無視していくつの数値が得られますか?1つの数値のみ(ゼロ)になります。これは、ゼロの確率が0であることを意味します1/676。1を生成する数はいくつですか?3は1、2、3になります。これは、1の確率があることを意味し3/676ます。2、4、5、6、7、または8で生成でき、確率5、3には確率7などがあり、連続する正方形の差は2ずつ着実に増加するため、このパターンは数字が上がるたびに続きます25(Z)まで。

漏れやすい修道女のおかげで1バイト節約!


chr(int(65+randint(676)**.5))
リーキー修道女

1
できますchr(int(65+random()**.5*26))。26 ==√676であるため、代数的にも同じことです。そして今、操作の順序はあなたの側にあります
ウィートウィザード

3
@EamonOlive別のバイト**2*26は逆分布に使用できます。
user81655

1
1/random()%26動作するはずです。
-xnor

1
時々1/0%26を与える
@xnor

5

PowerShell v2 +、33 31バイト

[char](65..90|%{,$_*$_}|Random)

65toから90(つまりASCII AからZ)の範囲を取り、それをループにパイプします。繰り返しごとに、カンマ演算子を使用して、その要素にその数を掛けた配列を作成します。たとえば、これにより65 65秒、66 66秒、67 67秒などがGet-Random作成されます。1つの要素を(均一にPRNGで)選択する大きな配列がパイプされます。各要素にはさまざまな数量があるため、各キャラクターには選択される確率がわずかに異なります。次に、それを括弧にカプセル化し、としてキャストしcharます。それはパイプラインに残り、出力は暗黙的です。

@LeakyNun、投稿される前でさえ数バイトゴルフしてくれてありがとう。:D)


確率

(ormat演算子のPオプションを示すことができるようにわずかに丸めます-f

PS C:\Tools\Scripts\golfing> 65..90|%{"$([char]$_): {0:P}"-f($_/2015)}
A: 3.23 %
B: 3.28 %
C: 3.33 %
D: 3.37 %
E: 3.42 %
F: 3.47 %
G: 3.52 %
H: 3.57 %
I: 3.62 %
J: 3.67 %
K: 3.72 %
L: 3.77 %
M: 3.82 %
N: 3.87 %
O: 3.92 %
P: 3.97 %
Q: 4.02 %
R: 4.07 %
S: 4.12 %
T: 4.17 %
U: 4.22 %
V: 4.27 %
W: 4.32 %
X: 4.37 %
Y: 4.42 %
Z: 4.47 %

1
答えを見ずに始めました。gal出力([char[]]"uz$(gal|out-string)"-cmatch'[a-z]'|random)で構築しようとすると、50文字になり、48文字になり、数字に切り替わり、42文字になり、31文字になり、そこで停止しました。リーダーボードを見て、それが私をどこに置くかを確認しました。ここです 同一のキャラクターのキャラクター。うるさい、私はおそらくそれを打ち負かすことはできません。
TessellatingHeckler

5

CJam、21 17 12バイト

5バイト節約してくれたMartin Enderに感謝します!

新しいバージョン

'\,:,s_el-mR

これは、パターン、次の文字列の配列を形成AABABC、などを。それを平坦化し、ランダムな文字を選択します。この文字列には26個のA、25個のB、24個のCなどが含まれているため、各文字には明確に選択される可能性があります。

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

説明

'\,          e# Push the range of all characters up to 'Z'
   :,        e# For each one, take the range of all characters up to it
     s       e# Convert the array of ranges to one string
      _el-   e# Subtract the lower case version of the string from itself
             e# This leaves only capital letters in the string
          mR e# Take a random character from it

旧版

26,:)'[,'A,- .*M*mr0=

各文字がアルファベットの位置と同じ回数だけ現れる文字列を作成することにより、明確な確率を取得します。

26,:)                 e# Push 1, 2, ... 26
     '[,'A,-          e# Push 'A', 'B', ... 'Z'
             .*       e# Vectorize: repeat each letter the corresponding number of times
               M*     e# Join with no separator
                 mr   e# Shuffle the string
                   0= e# Get the first character

5

R、23バイト

sample(LETTERS,1,,1:26)

ビルトインからの手紙を「サンプリング」するだけです。これ1:26は、各文字に異なる確率を与える重みのベクトルです。


1
1:26各文字の重みのベクトルです
-user5957401

それが有効な答えになります。説明を編集する価値があるので、Rに慣れていない人でもRの仕組みを理解できます。
-trichoplax

1
私は行くつもりだったのですが、それから私は、上の男が彼のコードでほとんど同じことをして、詳細な説明者を与えたことに気付きました。
user5957401

説明を追加しておくのは良いことです。ページにソリューションが表示される順序は、投票が入るにつれて変わる可能性があるため、「上」のものが後で上にならない場合があります。
-trichoplax

5

C、35バイト

このプログラムはRAND_MAX、デフォルトでgccにあるため、(2 ^ 32/2)-1と想定しています。-lmフラグを使用してコンパイルして、sqrt関数をリンクします。出力は、後続の改行なしで大文字としてstdoutに書き込まれます。

f(){putchar(sqrt(rand())/1783+65);}

オプションで、RAND_MAX(2 ^ 16/2)-1の場合、より短い32バイトバージョンを使用できます。

f(){putchar(sqrt(rand())/7+65);}

ただの楽しみのために、sqrt関数を使用しないバージョンまたは含まれる数学ライブラリを必要とするバージョンも作成しました(これにRAND_MAXは(2 ^ 32/2)-1が必要です)。かなりクール:

f(){float r=rand()/64+1;putchar((*(int*)&r>>23)-62);}

説明

[最初のプログラム]

を使用する最初の2つについてはsqrt、関数は単に範囲[0, RAND_MAX)[0, 25]除算にマッピングAし、値に65(ASCII )を追加してASCIIアルファベットにシフトしてから出力します。

[第2プログラム]

2番目のプログラムは、同様の戦略を実行しますが、sqrtオペレーターを使用しないため、もう少し複雑です。浮動小数点の指数ビットは、整数を割り当てると自動的に計算されるため、数値の2を底とする対数を取得する粗雑な方法として効果的に使用できます。

RAND_MAXエンコードされた指数値25に到達するまで範囲が必要なだけなので、(2 ^ 32/2-1)/(2 ^ 25)の計算では約64が得randられます。この新しい範囲に。また、0の浮動小数点表現は奇妙であり、このアルゴリズムを破るので、値に1を追加しました。

次に、フロートは整数に型変換され、ビットシフトやその他の操作が可能になります。IEEE 754浮動小数点数では、指数ビットはビット30〜23であるため、数値は23ビット右にシフトされ、仮数が切り捨てられ、生の指数値が整数として読み取られるようになります。符号ビットも指数ビットを超えていることに注意してください。ただし、ネガは存在しないため、マスクアウトする必要はありません。

ただし、以前のようにこの結果に65を追加するのではなく、浮動小数点指数は0から255までの符号なし8ビット整数として表されます。0の指数値は127です(単純に127を減算して、実際の「符号付き」指数値を取得します)。127-65は62なので、代わりに単純に62を減算して、この浮動小数点指数範囲からASCIIアルファベット範囲にシフトし、すべて1回の操作で行います。

分布

私は数学の専門家ではないので、これらの分布の正確な式を確実に言うことはできませんが、範囲のすべての値をテストして[0, RAND_MAX)、ある文字の範囲の終わりと他の文字の始まりの間の距離が決してないことを示すことができます同じ。(これらのテストでは、(2 ^ 32/2)-1)ランダムな最大値を想定しています)

[最初のプログラム]

Letter - Starting Location
A - 0
B - 3179089
C - 12716356
D - 28611801
E - 50865424
F - 79477225
G - 114447204
H - 155775361
I - 203461696
J - 257506209
K - 317908900
L - 384669769
M - 457788816
N - 537266041
O - 623101444
P - 715295025
Q - 813846784
R - 918756721
S - 1030024836
T - 1147651129
U - 1271635600
V - 1401978249
W - 1538679076
X - 1681738081
Y - 1831155264
Z - 1986930625

[第2プログラム]

Letter - Starting Location
A - 0
B - 64
C - 192
D - 448
E - 960
F - 1984
G - 4032
H - 8128
I - 16320
J - 32704
K - 65472
L - 131008
M - 262080
N - 524224
O - 1048512
P - 2097088
Q - 4194240
R - 8388544
S - 16777152
T - 33554368
U - 67108800
V - 134217664
W - 268435392
X - 536870848
Y - 1073741760
Z - 2147483520

序数を返すだけで印刷するよりも短くなりませんか?charはCの整数型であるため、これは受け入れられるはずです。
メゴ

@Megoああ、そうすることができるなら、私はゴルフを始めたばかりなので、許容できる出力と考えられるものにあまり詳しくありません。
レモンドロップ

4

Python 2、72バイト

from random import*
print choice(''.join(i*chr(i)for i in range(65,91)))

文字にそのASCII値を乗算し、結果の文字列からランダムに1文字を選択します。

選択されている各文字の確率をパーセンテージで示します。

A 3.23
B 3.28
C 3.33
D 3.37
E 3.42
F 3.47
G 3.52
H 3.57
I 3.62
J 3.67
K 3.72
L 3.77
M 3.82
N 3.87
O 3.92
P 3.97
Q 4.02
R 4.07
S 4.12
T 4.17
U 4.22
V 4.27
W 4.32
X 4.37
Y 4.42
Z 4.47

試してください:https : //repl.it/Cm0x


4

ゼリー、5 バイト

ØAxJX

(均等スコアが、異なる方法に、既存のゼリー溶液デニスによって)。

各文字が得られる確率は、アルファベットの1から始まるインデックスを351で除算したものです-26番目の三角形の数:

  • P(A)= 1/351、P(B)= 2/351、...、P(Z)= 26/351。

1 + 2 + ... + 26 = 351なので、P(letter)= 1です。

実装:

ØAxJX    - no input taken
ØA       - yield the alphabet: 'ABC...Z'
   J     - yield [1,...,len(Left)]: [1,2,3,...26]
  x      - Left times Right: 'abbccc...zzzzzzzzzzzzzzzzzzzzzzzzzz'
    X    - choose random element from Left

TryItOnlineでテストするか、10万回の実行分布を取得します(デニスへのコードクレジット)


どこでゼリーが上手になることを学びましたか?JellyがPPCG以外の常識になるとは信じがたいです。
アディソンクランプ

1
@Syxer私はwikiを見ただけで大騒ぎしました-それでもすべてを取得しないでください:)
ジョナサンアラン

1
じゃあ。PPCGへようこそ、賛成票を投じてください。
アディソンクランプ

3

q、38バイト

特に短いわけではありませんが...

.Q.A(reverse 0.9 xexp til 26)binr 1?1f

離散累積分布関数は次のシーケンスです

0.9 ^ 26, 0.9 ^ 25, ..., 0.9 ^ 0

そして、単に分布からサンプリングします。


3

JavaScript(ES6)、45バイト

_=>(n=Math.random(),10+n*n*26|0).toString(36)

ランダム値を二乗することにより、不均一な分布を実現します。Math.random()範囲のフロートを返します[0,1)ので、これを二乗した結果は0(またはa)になります。

テスト


42 B、(n=Math.random(),10+26*n+n|0).toString(36)
エペロンダンツラー

3

Oracle SQL 11.2、212バイト

アルファベットの文字位置を確率として使用する

SELECT c FROM(SELECT dbms_random.value(0,351)v FROM DUAL),(SELECT c,e,LAG(e,1,0)OVER(ORDER BY c)s FROM(SELECT CHR(LEVEL+64)c,SUM(LEVEL)OVER(ORDER BY LEVEL)e FROM DUAL CONNECT BY LEVEL<27))WHERE v BETWEEN s AND e;

ゴルフをしていない

SELECT c FROM
  (SELECT dbms_random.value(0,351)v FROM DUAL), -- random value
  (
    SELECT c,e,LAG(e,1,0)OVER(ORDER BY c)s -- Mapping each character to its interval 
    FROM   (
             -- Each char has it's position in the alphabet as probability
             SELECT CHR(LEVEL+64)c,SUM(LEVEL)OVER(ORDER BY LEVEL)e 
             FROM   DUAL 
             CONNECT BY LEVEL<27
           )  
  )
WHERE v BETWEEN s AND e -- match the random value to an interval

3

TI-Basic、39バイト

sub("ABCDEFGHIJKLMNOPQRSTUVWXYZ",int(26^rand),1

rand (0,1]の一様な値を生成します。これにより、26 ^ randに1〜26の整数に等しい異なる確率が与えられます。

古いバージョン、45バイト

sub("ABCDEFGHIJKLMNOPQRSTUVWXYZAAA",1+int(4abs(invNorm(rand))),1

TI-Basic整数の精度が制限されているため、正規分布はµ±7.02σ内の数値の生成に制限されています(を参照randNorm()。したがって、µ 0とσ1の乱数の絶対値を取得し、4を掛けて前述の実用的な範囲をµ±28.08σに増やします。次に、値をフロアし、1を追加します。これsub(は、インデックスが1であるため、範囲が1〜29で、それぞれの確率が異なるためです。


1
@trichoplaxそれは私の間違いでした。[0,29]であった古いバージョンから30個残っていました。今すぐ修正しました。
ティムテック

間隔(0,1)は[0,1]と想定されています。
kamoroso94

@ kamoroso94確認しましたか?「注:乱数生成アルゴリズムの仕様のためには、生成することができる最小の数は、可能な最大数は、実際に1である0よりわずかに大きい」 -から引用tibasicdev.wikidot.com/rand
Timtech

3

PHP、92 84バイト

for($i=65,$x=0;$i<91;$a.=str_repeat(chr($i++),$x))$x++;echo substr($a,rand(0,$x),1);

すべての文字の文字列を作成し、ループを何度も繰り返し、その文字列から文字をランダムに選択します。アルファベットの後半の文字は、結果としてより高い確率を持ちます

バイトを削るためにここにinsertusernameをありがとう

結果の確率(%で並べ替え)

A => 0.29%
B => 0.62%
C => 0.82%
D => 1.15%
E => 1.50%
F => 1.65%
G => 2.00%
H => 2.27%
I => 2.52%
J => 2.80%
K => 3.13%
L => 3.47%
M => 3.72%
N => 3.93%
O => 4.15%
P => 4.59%
Q => 4.81%
R => 5.17%
S => 5.44%
T => 5.68%
U => 6.06%
V => 6.13%
W => 6.60%
X => 6.95%
Y => 7.17%
Z => 7.38%


1
実際にルールに従うように変更されました。私の間違い
-gabe3886

@insertusernamehere実行すると未定義の変数通知が表示され、文字出力は表示されません
-gabe3886

あっ、すみません。私は夢中になって削除されたと思いますが、$x=0これは明らかに必要です。ここだ84バイトバージョンは:for($i=65,$x=0;$i<91;$a.=str_repeat(chr($i++),$x))$x++;echo substr($a,rand(0,$x),1);あなたは、値の大きいを取得するために管理しましたGあなたのコードを実行しているとき?とにかく、noticeゴルフをするときはいつでも無視できます。
insertusernamehere

1
私がやったが、それは収穫するのに時間がかかります。チェックするために約10万回の繰り返しを実行しました
gabe3886

strlenのは$a351ですが、最初のうち、ランダムな文字を選んでいる$x(26)文字。あなたはそれを修正し、最終の変化にあなたの確率を保つことができる$x3501バイトのために。ここでは77バイトのバージョンは、修正の問題ということですが、また一緒にはるかに近い確率をもたらします:for($i=65;$i<91;$a.=str_repeat(chr($i),$i++));echo substr($a,rand(0,2014),1);
ジョー。

3

Befunge、168 164バイト

少し異なる確率で、最初のものよりコンパクト:最初に?持っ1/4「最初の試み」にAを印刷する機会を、2/4チャンスは同じに戻って来て?、そして1/4に移動します次。残りの?sにはそれぞれ、その下にある文字を印刷する1/4のチャンスがあり、1/4で再試行し、1/4で次の文字に移動し、1/4で前に移動します。繰り返しますが、Aを印刷する確率は、Z を印刷する確率よりもはるかに高くなります。

??????????????????????????>
""""""""""""""""""""""""""
ABCDEFGHIJKLMNOPQRSTUVWXYZ
""""""""""""""""""""""""""
>>>>>>>>>>>>>>>>>>>>>>>>>>,@
##########################

Befunge、186バイト

明らかにこれで勝つつもりはありませんが、それでも面白い答えだと思います:)

vそして>、それぞれ下方および右にカーソルを操縦。?オペレータは、ランダムに四の方向のいずれかにカーソルをオフに送信します。最初?によって「ブロック」されるvと、>どちらかがAを印刷、または次にダウンする:それだけで行くには、2つの方法がありますので、二つの方向で?。したがって、最初から?単独でAを印刷する可能性は50%です。

?は、1/3の確率でBを印刷し、3分の1が上昇し、1/3がさらに下降します。などなど

上の文字は下の文字よりも印刷される可能性がはるかに大きいことは明らかですが、各文字の可能性は正確にはわかりません。

正確な数学の助けをいただければ幸いです:)

少なくとも、最初の試行でカーソルがZまで下に移動する可能性は1/2 * 1/3 ^ 25ありますが、カーソルが上下に移動する可能性が各文字にどのように影響するかはわかりません。

,@ 印刷して終了します。

 v
>?"A"v
>?"B"v
>?"C"v
>?"D"v
>?"E"v
>?"F"v
>?"G"v
>?"H"v
>?"I"v
>?"J"v
>?"K"v
>?"L"v
>?"M"v
>?"N"v
>?"O"v
>?"P"v
>?"Q"v
>?"R"v
>?"S"v
>?"T"v
>?"U"v
>?"V"v
>?"W"v
>?"X"v
>?"Y"v
>?"Z">,@

2

J、20 18バイト

({〜?@#)u:64 +#〜1 + i.26
({〜?@#)u:64 +#〜i.27

オンライン通訳

大文字。

各文字の確率は、アルファベットの1から始まるインデックスです。


2

zsh、63バイト

for i in {A..Z};for j in {1..$[#i]};s+=$i;echo $s[RANDOM%$#s+1]

この文字列を作成することで機能します:

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

別名65回A、66回B、67回C ...

そして、その中からランダムな文字を選択します


なぜ65歳から始めたのですか?
-gcampbell

1
@gcampbell 65はAアスキーです。1から開始できますが、内部ループ{65..$[#i]}は1文字長くなります
-izabera


2

バッチ、116バイト

@set/ar=%random%%%676,s=r/26,r%%=26,s-=(r-s)*(r-s^>^>31)
@set a=ABCDEFGHIJKLMNOPQRSTUVWXYZ
@call echo %%a:~%s%,1%%

2つのランダム変数の大きい方または小さい方(どちらを忘れるか)を選択することで機能します。


2

Matlab、22

しばしば初期の手紙を返しますが、理論的にはそれらすべてに触れることができます!

乱数で区切られたものを取り、これを26に制限し、キャラクターに変換します。

['' 96+min(1/rand,26)]

もちろん、それほど短くはありませんが、おそらくこの概念は他の答えを引き出すことができます。


rand[0、1)の値を返しますか?つまり、ゼロは含むが、1は含まれません。これがときどき1/0になる場合min(1/0,26)でも、26を返しますか、それともエラーを返しますか?
-trichoplax

私の知る限りrand、(0,1)の値を返すので、問題はないはず
です-paul.oderso

1
@trichoplaxあなたが表示されませんにもかかわらず、rand実際には0を返し、min(1/0,26)実際には26を返します
デニスJaheruddin

その場合、良い解決策:)
trichoplax


2

ラビリンス、19バイト

__v6%_65+.@
" )
"^2

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

これは、反復ごとに、a)ゼロから開始するカウンターをインクリメントするか、b)確率50%で終了するループです。ループの最後で、カウンタは26を法として取得され、65に加算されてAとの間の文字を返しZます。

これにより、A50%をBわずかに超える確率、25%をわずかに超える確率、およびZ1/2 26をわずかに超える確率が得られます。理論的には、このイベントは永遠に実行される可能性がありますが、このイベントはチャレンジで要求される確率ゼロです(実際には、PRNGはその期間中のある時点で両方の可能な結果を​​返すため、おそらく不可能です)。

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