Випадковий гольф дня №7: виразно випадковий персонаж


47

Про серію

Це гостьова запис для серії "Випадкові гольфи дня".

По-перше, ви можете ставитися до цього, як і до будь-якого іншого виклику коду для гольфу, і відповісти на нього, не турбуючись про серію взагалі. Однак існує лідери у всіх викликах. Ви можете знайти таблицю лідерів разом з додатковою інформацією про серію в першій публікації .

Вхідні дані

Введення не приймається.

Вихід

Єдина літера алфавіту (справа нерелевантна) з необов’язковим зворотним новим рядком. Кожна літера повинна мати ненульову ймовірність обрання, і всі 26 ймовірностей повинні бути чіткими . Щоб усунути всю неоднозначність: Розрізнення означає, що не повинно бути двох імовірностей, рівних одна одній.

Оцінка балів

Це код гольфу. Виграє найкоротший код у байтах.

Дійсний запис - це повна програма або функція, яка має нульову ймовірність не завершити роботу.

Алфавіт

Щоб уникнути плутанини, особливим алфавітом, який слід використовувати, є латинський алфавіт:

Або

ABCDEFGHIJKLMNOPQRSTUVWXYZ

або

abcdefghijklmnopqrstuvwxyz

Ви можете вибрати для виведення великої та малої літери. Крім того, ви можете вивести різні випадки на різних пробігах, якщо це допоможе. Ймовірність для даної літери - це ймовірність появи цієї букви в будь-якому випадку (верхній або нижній).

Пояснення

Оскільки це буде зовсім не очевидно з результату, будь ласка, включіть чітке пояснення того, як ви досягли 26 різних імовірностей.

Таблиця лідерів

( звідси )

Перший пост серії також генерує загальну лідерну позицію.

Щоб відповіді відображалися, почніть кожну відповідь із заголовка, використовуючи такий шаблон Markdown:

## Language Name, N bytes

де Nрозмір вашого подання. Якщо ви покращите свій рахунок, ви можете зберегти старі бали у заголовку, прокресливши їх. Наприклад:

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

(Мова наразі не відображається, але фрагмент вимагає і аналізує його, і я можу додати мовну таблицю лідерів за мовою в майбутньому.)


як би ви виміряли 26 різних ймовірностей? запустивши програму 26 разів?
ВИ

1
@YOU перегляньте рішення - є кілька різних підходів із відмінними поясненнями
trichoplax

Якщо це функція, чи потрібно її друкувати або вона може просто повернути значення символу?
Джефф Ріді

@Geoff Відповідно до наших значень за замовчуванням для введення та виведення , друк у STDOUT або повернення символу добре.
трихоплакс

@Geoff зауважте, що він повинен бути символом, а не просто числом, що представляє його. Наприклад, Aа не 65.
трихоплакс

Відповіді:


13

Піта, 5

Os._G

Спробуйте тут

Обчислює префікси алфавіту, так: ["a", "ab", "abc", ..., "abcdefghijklmnopqrstuvwxyz"]. Потім вирівнюється список і рівномірно вибирає з нього випадковий елемент. Це означає, що оскільки aз’являється 26 разів, тоді як bз’являється 25 разів, аж до zлише 1 вигляду, кожна літера має різний шанс з’явитися. Загальний рядок містить 351 символ.


1
Мені подобається ця відповідь. Дуже розумний.
Аллен Фішер

24

MATL, 6 символів

1Y2Xr)

Пояснення:

XrВізьміть звичайно розподілене випадкове число )Використовуйте це, щоб індексувати на ... 1Y2Алфавіт

Розподіл симетричний близько 0, а переклад числа в char симетричний близько 0,5. Тому такі ймовірності повинні бути різними.


2
О, дуже гарна ідея використовувати гауссовий розподіл!
Луїс Мендо

1
"найкраща" мова для роботи, все ще побита желе. Хоча відмінне рішення.
Сократичний Фенікс

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 рівномірно довільно обрана , перестановка L . Визначте кінцеву послідовність M через M n = max (L n , S n ) .

Зафіксуйте n в 0,… 25 і визначте k як індекс, такий, що L n = S k .

З ймовірністю 1/26 , L п = S п і п = до , так що М н = л н і л н occurrs один раз в М .

З вірогідністю 25/26 , L n ≠ S n і n ≠ k . У цьому випадку відбувається таке.

  • Імовірно, n / 25 , S n є одним з L 0 ,…, L n - 1 , тому L n > S n і M n = L n .

  • Незалежно, також з ймовірністю n / 25 , k - один із 0,… n - 1 , тому S k > L k і M k = S k = L n .

Таким чином, очікувана кількість випадків виникнення L n в M становить 1/26 + 25/26 · (n / 25 + n / 25) = (2n + 1) / 26 .

Нарешті, якщо ми тепер вибрати термін т з М рівномірно випадковим чином , буква L п ми бути обрані з ймовірністю (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 де завгодно, що Z з'явилися в обох списках. тому в результаті є приблизно 52x більше A, ніж Z.
Спарр

1
@RobertFraser Я додав пояснення.
Денніс

2
@DennisJaheruddin У UTF-8, так. Однак Jelly використовує користувацьку кодову сторінку, що кодує всі символи, які вона розуміє, як один байт кожен. Посилання байтів у заголовку вказує на нього.
Денніс

2
Я бачу, коли я прочитав пояснення, було не відразу зрозуміло, що ви також не можете скористатися звичайним рядом UTF-8. Отже, я маю рацію припустити, що зміною інтерпретатора та відображенням усіх символів на окремі символи UTF-8 у вас був би абсолютно однаковий код (лише менш читабельний / набраний)? - Якщо так, подумайте про розширення пояснення, щоб згадати, що для цілей гольфу слід розраховувати байку.
Денніс Джахеруддін

2
@DennisJaheruddin Як пояснено у README (перша посилання у заголовку), інтерпретатор має два режими (кодова сторінка 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

Насправді вам цього не потрібно k! Помітив, що при спробі codegolf.stackexchange.com/a/89648/11159
Денніс Джахеруддін

13

Java 7, 62 57 56 байт

5 байт завдяки Poke.

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

@ Дякую, гольфу.
Leaky Nun

Чи можете ви зберегти байт, перемістивши 676 за межами дужок?
трихоплакс

@trichoplax Що ти маєш на увазі?
Leaky Nun

2
sqrt(x*y*y) = sqrt(x)*y
трихоплакс

10

Perl, 24 байти

-4 байти завдяки @Martin Ender
-1 байт завдяки @Dom Hastings

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


Як це працює : Я думаю, що код досить явний, але все ж: він вибирає випадкове число між 0і rand 26. Тож існує набагато більша ймовірність того, що обираються числа, близькі до 0(літери A).


Пояснення має сенс для мене :)
trichoplax

Приємне рішення! Ви можете зберегти 1 байт за допомогою голого списку та +:say+(A..Z)[rand rand 26]
Дом Гастінгс

@DomHastings Aarf, я дурний. Я спробував, (A..Z)[...]і це не спрацювало, тому я подумав, що можу використати анонімний масив, як це, але це було тільки через say.. дякую! :)
Дада

10

PHP, 44 36 29 27 байт

Закреслений 44 все ще є регулярним 44; (

Завдяки вставцікористувача тут, Petah та Crypto за всю допомогу

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

Він вибирає випадкове число між 0 і 675 (= 26 2 -1), бере його квадратний корінь і перекриває його ( chrфункція перетворює його аргумент у ціле число). Оскільки квадрати мають різні проміжки між ними, ймовірність обрання кожного числа відрізняється. Кожен п вибирається з вірогідністю (2n + 1) / 676.

Додавання 65 до цього числа дає вам випадковий символ від Aдо Z.

Ідея коду працює 1000 000 разів


Ви можете грати в гольф від 4 байта : range(A,Z).
insertusernamehere

@insertusernamehere: Дякую за підказку, але мені вдалося пройти в гольф 8 байтів, не використовуючи діапазон взагалі і просто використовуючи chr().
Ділова кішка


1
@insertusernameтудь ти занадто легко <s>&nbsp;44&nbsp;</s>
здається

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

Так, це не спрацює. Можливо, мені найрозумніший спосіб!
Фредерік

Ну, десь завжди буде підкладка! Повинен думати щодо цього ...
Frédéric

1
Виправлено і коротше - вражає :)
трихоплакс

1
@trichoplax Дякую! Приємний виклик btw!
Фредерік

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 (значення ascii "A"), перетворює його в char і друкує.

Це дає кожному числу від 0 до 25 виразну ймовірність. Щоб зрозуміти чому, подумайте про це так. Скільки цифр, ігноруючи не цілі числа, коли ви берете квадратний корінь і підлогу, даєте 0? Лише одне число буде (нуль). Це означає, що нуль має ймовірність 1/676. Скільки чисел дасть 1? 3 будуть, 1, 2 і 3. Це означає, що людина має ймовірність 3/676. Дві можуть бути отримані з 4, 5, 6, 7 або 8, надаючи їй ймовірність 5, три має ймовірність 7 і т.д. до 25 (Z).

1 байт збережено завдяки нещільній монахині!


chr(int(65+randint(676)**.5))
Leaky Nun

1
Ви могли б зробити chr(int(65+random()**.5*26)). Це те саме алгебраїчно, тому що 26 == √676. і тепер порядок операцій на вашому боці
Пшеничний майстер

3
@EamonOlive Інший байт **2*26може бути використаний для оберненого розподілу.
користувач81655

1
1/random()%26також повинні працювати.
xnor

1
@xnor, який іноді даватиме 1/0% 26
трихоплакс

5

PowerShell v2 +, 33 31 байт

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

Приймає діапазон від 65до 90(тобто, ASCII Aдо Z), труби його через петлю. Кожну ітерацію ми використовуємо оператор комами, щоб створити масив цього елемента, кратний цьому номеру. Наприклад, це зробить 65 65с, 66 66с, 67 67с і т. Д. Цей великий масив прокладений, до Get-Randomякого буде (рівномірно PRNG) вибрати один елемент. Оскільки в кожному елементі є різні кількості, кожен символ має дещо виразний відсотковий шанс бути вибраним. Потім ми інкапсулюємо це в парені і подаємо це як char. Це залишилося на конвеєрі, і вихід неявний.

(Дякуємо @LeakyNun за те, що ти граєш на кілька байтів ще до того, як він був розміщений.: D)


Ймовірності

(незначне округлення, щоб я міг продемонструвати Pваріант -fоператора ormat)

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
Я почав, не дивлячись ні на одну з відповідей; спробував побудувати на galoutput ( [char[]]"uz$(gal|out-string)"-cmatch'[a-z]'|random) дістався до 50 символів, потім 48, перейшов на числа і отримав 42, потім 31 і там зупинився; подивився на таблицю лідерів, щоб побачити, куди це мене поставить. Саме тут. Характер для персонажа однаковий. Welp, я, мабуть, не можу цього перемогти.
TessellatingHeckler

5

CJam, 21 17 12 байт

Дякую Мартіну Ендеру, що врятував мені 5 байт!

Нова версія

'\,:,s_el-mR

Це формує масив рядків наступний шаблон A, AB, ABCі так далі. Це згладжує його і вибирає випадкового персонажа. Оскільки цей рядок містить 26 А, 25 В, 24 С та ін., Кожна літера має чітку ймовірність обрання.

Спробуйте в Інтернеті!

Пояснення

'\,          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, могли зрозуміти, як це працює.
трихоплакс

1
Я збирався, і тоді я зрозумів, що хлопець, що передував мені, зробив майже те саме, що в його коді, і дав глибокий пояснювач.
користувач5957401

Добре, що ви додали пояснення - порядок, коли рішення з’являються на сторінці, може змінюватись, коли голоси надходять, щоб згодом "вище" не було вище.
трихоплакс

5

C, 35 байт

Ця програма передбачає RAND_MAX(2 ^ 32/2) - 1, як це за замовчуванням на gcc. Компілюйте з -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);}

Пояснення

[Перша програма]

Для перших двох з використанням sqrt, функція просто відображає діапазон , [0, RAND_MAX)щоб [0, 25]шляхом ділення, а потім додає 65 (ASCII A) значення , щоб перевести його в ASCII алфавіту перед виведенням його.

[Друга програма]

Друга програма трохи складніша, оскільки вона робить аналогічну стратегію, але без sqrtоператора. Оскільки біти експонента плаваючої точки автоматично обчислюються при призначенні цілого числа, вони можуть бути ефективно використані як неочищений спосіб отримати базовий 2 логарифм числа.

Оскільки ми хочемо лише, щоб діапазон RAND_MAXдосягав закодованого показника значення 25, обчислення (2 ^ 32/2 - 1) / (2 ^ 25) дає нам приблизно 64, яке використовується під час поділу randдля відображення його до цього нового асортименту. Я також додав 1 до значення, оскільки представлення з плаваючою точкою 0 є досить дивним і порушить цей алгоритм.

Далі, поплавок набирається типом до цілого числа, щоб дозволити бітшифтинг та інші подібні операції. Оскільки в номерах IEEE 754 з плаваючою точкою біти експоненти складають біти 30-23, то число зміщується вправо на 23 біти, відрізаючи мантісу і дозволяючи зчитувати значення необробленого показника як ціле число. Зауважте, що бітовий знак також знаходиться за межами бітів показника, але оскільки жодних негативів не існує, його не потрібно маскувати.

Замість того, щоб до цього результату додати 65, як ми це робили раніше, проте експоненти плаваючої точки представляють собою непідписане 8-бітове ціле число від 0 до 255, де значення показника 0 дорівнює 127 (Просто відніміть 127, щоб отримати фактичне "підписане" значення показника ). Оскільки 127 - 65 - це 62, ми замість цього просто віднімаємо 62, щоб обидва змісти його з цього діапазону показників плаваючої точки і в діапазон алфавіту ASCII все за одну операцію.

Поширення

Я не знаю математику, тому не можу точно сказати точну формулу цих розподілів, але я можу (і зробив) тестувати кожне значення діапазону, [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

[Друга програма]

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

@ Mee Так добре, якщо ви можете це зробити, я просто новачок у гольфі, тому я не надто знайомий з тим, що вважається прийнятним результатом.
Лимонний падіння

4

Python 2, 72 байти

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

Помножує персонаж на його значення ascii, потім вибирає один символ навмання з отриманого рядка.

Ось вірогідність кожної літери, що вибирається, у відсотках:

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

(Рівний бал, але інший метод , до існуючого рішення Jelly від Dennis.)

Ймовірність отримання кожної літери - це індекс на основі алфавіту, розділений на 351 - 26-е трикутне число:

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

Оскільки 1 + 2 + ... + 26 = 351, P (буква) = 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 або отримайте розповсюдження 100K прогонів (код коду Деннісу)


Де ти навчився бути таким хорошим в Jelly? Мені важко повірити, що Jelly буде загальновідомим поза PPCG.
Аддісон Кримп

1
@Syxer Я просто подивився на вікі і відбив - все одно не все отримую :)
Джонатан Аллан

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, помноживши на чотири, щоб збільшити зазначений раніше практичний діапазон до µ ± 28,08σ. Потім ми підбиваємо значення і додаємо 1, оскільки sub(є 1-індексованим, що дає нам діапазон від 1-29 з різними ймовірностями кожного.


1
@trichoplax Це моя помилка, у мене залишилось 30 від старої версії, яка була [0,29]. Я зараз це виправив.
Timtech

Інтервал (0,1] повинен бути [0,1).
kamoroso94

@ kamoroso94 Ви перевірили? "Примітка. Через специфіку алгоритму генерації випадкових чисел найменше число, яке можна створити, трохи перевищує 0. Найбільша можлива кількість насправді 1", - цитується з 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);

Будує рядок з усіх літер, повторює кількість разів через цикл, який ми є, а потім вибирає букву з цього рядка навмання. Букви пізніше в алфавіті мають більшу ймовірність

Завдяки вставцікористувача для гоління байтів

ймовірності результатів (упорядковані%)

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

@insertusernameту я отримую сповіщення про невизначені змінні, коли запускаю це, а вихід літер немає
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під час запуску коду? У будь-якому випадку, ви завжди можете ігнорувати notices при гольфі.
insertusernamehere

1
Я так і зробив, але для збирання врожаю потрібен час. Я пробіг його через приблизно 100k ітерацій, щоб перевірити
gabe3886

strlenЗ $a351, але ви тільки збирання випадкового характеру з перших $x(26) символів. Ви можете виправити це і зберегти свої ймовірності зі зміною фіналу $xна 350+1 байт. Ось версія 77 байт, яка виправляє проблему, але також зближує ймовірності:for($i=65;$i<91;$a.=str_repeat(chr($i),$i++));echo substr($a,rand(0,2014),1);
Jo.

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, або вниз до наступного ?. Тож у першого ?лише є 50% шансів надрукувати А.

Наступний ?має 1/3 шансу надрукувати B, 1/3 повернутися назад і 1/3 піти далі вниз. І т.д.

Це повинно бути цілком очевидно, що більш високі літери мають набагато більший шанс надрукувати, ніж нижчі, але я не точно впевнений, які шанси кожної літери.

Деяка допомога з точною математикою буде вдячна :)

Принаймні є ймовірність 1/2 * 1/3 ^ 25, що курсор переміститься повністю до Z під час першої спроби, але я не впевнений, як шанси переміщення курсору вгору та вниз впливають на кожну букву.

,@ друкує і виходить.

 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

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
літр


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

Матлаб, 22

Часто повертаються ранні листи, але теоретично можуть торкнутися їх усіх!

Бере одну поділену випадковим числом, обмежує це значенням 26 і перетворює її на символ.

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

Звичайно, не дуже короткий, але, можливо, концепція може надихнути інших відповідей.


Чи randповертає значення в [0, 1)? Тобто, включаючи нуль, але не враховуючи одного. Якщо це час від часу призводить до 1/0, все min(1/0,26)одно повернеться 26, або помилка?
трихоплакс

Наскільки я знаю, randповертає значення в (0,1), тож не повинно виникнути проблем
paul.oderso

1
@trichoplax Незважаючи на те, що ви не побачите randповернення 0 на практиці, min(1/0,26)насправді повертається 26.
Денніс Джахеруддін

У такому випадку приємне рішення :)
трихоплакс

2

CJam, 10 байт

CJam підхід №3 ...

26mr)mr'A+

Спробуйте в Інтернеті!

Це створює рівномірно випадкове число xміж 1 і 26, а потім використовує це для створення рівномірно випадкового числа між 0і до x-1якого додається A. Це зміщує результати до менших символів.


2

Лабіринт , 19 байт

__v6%_65+.@
" )
"^2

Спробуйте в Інтернеті!

Це цикл, який при кожній ітерації або збільшує а) збільшення лічильника, який починається з нуля, або b) закінчується, імовірність 50%. В кінці циклу лічильник приймається за модулем 26 і додається до 65, щоб дати букву між Aі Z.

Це дає ймовірність Aтрохи більше 50%, Bтрохи більше 25% і так далі до Zтрохи більше 1/2 26 . Теоретично існує можливість цього запуститись назавжди, але ця подія має нульову ймовірність, як того вимагає виклик (на практиці це, мабуть, неможливо все-таки, оскільки ПРНГ поверне обидва можливі результати в якийсь момент протягом свого періоду).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.