สุ่มกอล์ฟประจำวัน # 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 Reedy

@Geoff ตามค่าเริ่มต้นของเราสำหรับอินพุตและเอาต์พุตการพิมพ์ไปที่ STDOUT หรือส่งคืนอักขระนั้นใช้ได้
trichoplax

@Geoff โปรดทราบว่ามันจะต้องเป็นตัวละครไม่ใช่เพียงแค่ตัวเลขที่แสดงถึงมัน ยกตัวอย่างเช่นมากกว่าA 65
trichoplax

คำตอบ:


13

Pyth, 5

Os._G

ลองที่นี่

คำนวณส่วนนำหน้าของตัวอักษรดังนี้: ["a", "ab", "abc", ..., "abcdefghijklmnopqrstuvwxyz"]. จากนั้นจึงทำให้รายการแบนและเลือกองค์ประกอบแบบสุ่มจากองค์ประกอบนั้นอย่างสม่ำเสมอ ซึ่งหมายความว่าตั้งแต่aปรากฏเป็น 26 ครั้งในขณะที่bปรากฏขึ้น 25 ครั้งตลอดจนถึงzลักษณะที่ปรากฏเพียง 1 ตัวอักษรแต่ละตัวมีโอกาสปรากฏที่แตกต่างกัน สตริงทั้งหมดมี 351 ตัวอักษร


1
ฉันชอบคำตอบนั้น ฉลาดมาก.
อัลเลนฟิชเชอ

24

MATL, 6 ตัวอักษร

1Y2Xr)

คำอธิบาย:

Xrใช้หมายเลขสุ่มแบบกระจายปกติ )ใช้สิ่งนี้เพื่อทำดัชนีลงใน ... 1Y2ตัวอักษร

การแจกแจงแบบสมมาตรประมาณ 0 และการแปลตัวเลขเป็นตัวอักษรแบบสมมาตรประมาณ 0.5 ความน่าจะเป็นดังกล่าวควรมีความชัดเจน


2
โอ้ความคิดที่ดีมากที่จะใช้การแจกแจงแบบเกาส์!
Luis Mendo

1
ภาษาที่ "ดีที่สุด" สำหรับงานยังคงถูกเจลลี่ ทางออกที่ดีแม้ว่า
Socratic Phoenix

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.

พื้นหลัง

Let 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

ด้วยความน่าจะเป็น26/01 , L n = S nและn = kดังนั้นM n = L nและL n occurrs ครั้งในM

ด้วยความน่าจะเป็น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)

สุดท้ายถ้าตอนนี้เราเลือกระยะเมตรของMสม่ำเสมอที่สุ่มตัวอักษรL nเราเลือกด้วยความน่าจะเป็น(2n + 1) / 26/26 = (2n + 1)

นี่จะให้การแจกแจงความน่าจะเป็นต่อไปนี้

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 ปรากฏในทั้งสองรายการ ดังนั้นผลลัพธ์จะมีประมาณ 52 เท่าของ A มากที่สุดเท่าที่ Z
SPARR

1
@RobertFraser ฉันได้เพิ่มคำอธิบายแล้ว
เดนนิส

2
@DennisJaheruddin ใน UTF-8 ใช่ อย่างไรก็ตามเจลลี่ใช้หน้ารหัสที่กำหนดเองที่เข้ารหัสอักขระทั้งหมดที่เข้าใจเป็นไบต์เดียว ไบต์เชื่อมโยงในจุดที่ส่วนหัวของมัน
เดนนิส

2
ฉันเห็นว่าเมื่อฉันอ่านคำอธิบายมันไม่ชัดเจนในทันทีว่าคุณไม่สามารถใช้ประโยชน์จากช่วง UTF-8 ปกติเช่นกัน ดังนั้นฉันถูกต้องที่จะสมมติว่าโดยการเปลี่ยนล่ามและการแมปตัวละครทั้งหมดลงบนตัวอักษร individul UTF-8 คุณจะมีรหัสที่เหมือนกันทั้งหมด (อ่าน / พิมพ์ได้น้อยลง)? - หากเป็นเช่นนั้นให้พิจารณาการขยายคำอธิบายเพื่อพูดถึงว่าอักขระถ่านควรนับเป็นไบต์สำหรับจุดประสงค์ในการเล่นกอล์ฟ
Dennis Jaheruddin

2
@DennisJaheruddin ดังที่อธิบายไว้ใน README (ลิงก์แรกในส่วนหัว) ล่ามมีสองโหมด (หน้ารหัสวุ้นและ 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 วิธีการที่ดี!
Luis Mendo

อาจ แต่นานกว่านั้นมาก : P
DJMcMayhem

อีกทางเลือกที่สนุก: matl.suever.net/…
Suever

จริงๆแล้วคุณไม่ต้องการk! สังเกตว่าขณะที่พยายามcodegolf.stackexchange.com/a/89648/11159
Dennis Jaheruddin

13

Java 7, 62 57 56 ไบต์

5 ไบต์ขอบคุณ Poke

1 ไบต์ขอบคุณ trichoplax

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 ขอบคุณ golfed
Leun Nun

คุณสามารถบันทึกไบต์ด้วยการย้าย 676 นอกวงเล็บได้หรือไม่
trichoplax

@trichoplax คุณหมายถึงอะไร
Leun Nun

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

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]
Dom Hastings

@DomHastings aarf ฉันโง่ ฉันลอง(A..Z)[...]แล้วมันใช้งานไม่ได้ดังนั้นฉันคิดว่าฉันสามารถใช้อาเรย์แบบไม่ระบุชื่อเช่นนั้นได้ แต่นั่นเป็นเพราะsay.. ขอบคุณ! :)
Dada

10

PHP, 44 36 29 27 ไบต์

ข้ามไป 44 ยังคงเป็นปกติ 44; (

ขอบคุณที่แทรกชื่อผู้ใช้ที่นี่, Petah และ Crypto สำหรับความช่วยเหลือทั้งหมด

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

มันเลือกตัวเลขสุ่มระหว่าง 0 และ 675 (= 26 2 -1) ใช้เวลารากที่สองของมันและชั้นมัน ( chrฟังก์ชั่นแปลงอาร์กิวเมนต์เป็นจำนวนเต็ม) เนื่องจากสแควร์สมีช่วงเวลาต่างกันความน่าจะเป็นของแต่ละหมายเลขที่เลือกนั้นแตกต่างกัน เลือก n ทุกอันด้วยความน่าจะเป็น (2n + 1) / 676

เพิ่ม 65 ไปยังหมายเลขนี้จะช่วยให้คุณเป็นตัวละครที่สุ่มจากไปAZ

Ideone ของรหัสทำงาน 1,000,000 ครั้ง


คุณสามารถปิดกอล์ฟ4 ไบต์range(A,Z) :
insertusernamehere

@insertusernamehere: ขอบคุณสำหรับเคล็ดลับ แต่ฉันก็สามารถที่จะเล่นกอล์ฟ 8 chr()ไบต์โดยไม่ได้ใช้ช่วงที่ทุกคนและเพียงแค่ใช้
แมวธุรกิจ

3
ดียิ่งขึ้น แต่น่าเสียดายที่เดินออก 44 ยังคงเป็นปกติ 44 :)
insertusernamehere

1
@insertusername ที่นี่คุณยอมแพ้ง่ายๆ :-)<s>&nbsp;44&nbsp;</s>
MonkeyZeus

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

8

R, 40 27 ไบต์

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

นี้จะนำ1ตัวเลขจาก26ตัวเลขที่สร้างการเจริญเติบโตที่มีความน่าจะเป็นที่มีต่อโดยไม่ต้องเปลี่ยนและแสดงตัวอักษรดัชนีซึ่งเป็นจำนวนนี้จากรายการของตัวอักษรตัวพิมพ์ใหญ่ZLETTERS

อาร์กิวเมนต์ของ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

ก็จะมีซับในเสมอ! ต้องคิดว่า 'bout มัน ...
Frédéric

1
คงที่และสั้นกว่า - น่าประทับใจ :)
trichoplax

1
@trichoplax ขอบคุณ! ขอท้า btw!
Frédéric

1
@AlbertMasclans: มันสามารถทำได้ แต่มันได้ทำไปแล้วในคำตอบของคนอื่นดังนั้นฉันไม่ต้องการที่จะ "คัดลอก"! แต่ขอบคุณล่ะ! ;)
Frédéric

8

> <> , 14 ไบต์

lx
;>dd+%'A'+o

> <> เป็นภาษา 2D แบบ toroidal และความน่าจะเป็นที่แตกต่างกันเกิดขึ้นเนื่องจากการสุ่มของภาษาเพียงแหล่งเดียว ลองออนไลน์!

คำสั่งที่เกี่ยวข้องคือ:

[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") แปลงเป็นถ่านและพิมพ์

สิ่งนี้ทำให้แต่ละหมายเลขมีความน่าจะเป็นที่ชัดเจนตั้งแต่ 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))
Leun Nun

1
chr(int(65+random()**.5*26))คุณสามารถทำ มันเหมือนกันพีชคณิตเพราะ 26 == √676 และตอนนี้คำสั่งของการดำเนินการอยู่ข้างคุณ
Wheat Wizard

3
@EamonOlive สำหรับไบต์อื่น**2*26สามารถใช้สำหรับการแจกแจงผกผัน
user81655

1
1/random()%26ควรทำงานเช่นกัน
xnor

1
@xnor ที่บางครั้งจะให้ 1/0% 26
trichoplax

5

PowerShell v2 +, 33 31 ไบต์

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

ใช้ช่วงตั้งแต่65ถึง90(เช่น ASCII AถึงZ) ไพพ์มันผ่านลูป การวนซ้ำแต่ละครั้งเราใช้เครื่องหมายคอมม่าเพื่อสร้างอาร์เรย์ขององค์ประกอบนั้นคูณด้วยจำนวนนั้น ตัวอย่างเช่นสิ่งนี้จะทำให้ 65 65s, 66 66s, 67 67s, ฯลฯ อาร์เรย์ขนาดใหญ่นั้นถูกไพพ์ไปGet-Randomซึ่ง (PRNG สม่ำเสมอ) จะเลือกองค์ประกอบหนึ่งอย่าง เนื่องจากมีปริมาณขององค์ประกอบแต่ละตัวที่แตกต่างกันอักขระแต่ละตัวจึงมีโอกาสในการเลือกเปอร์เซ็นต์ที่แตกต่างกันเล็กน้อย จากนั้นเราจะสรุปว่าใน parens 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
ฉันเริ่มโดยไม่ดูคำตอบใด ๆ พยายามสร้างgalผลลัพธ์ ( [char[]]"uz$(gal|out-string)"-cmatch'[a-z]'|random) มีอักขระได้ 50 ตัวจากนั้น 48 เปลี่ยนเป็นตัวเลขและเพิ่มเป็น 42 แล้วก็ 31 และหยุดที่นั่น ดูลีดเดอร์บอร์ดเพื่อดูว่าจะใส่ฉันที่ไหน ที่นี่. ตัวละครสำหรับตัวละครที่เหมือนกัน Welp ฉันอาจไม่สามารถเอาชนะได้
TessellatingHeckler

5

CJam, 21 17 12 ไบต์

ขอบคุณ Martin Ender ที่ช่วยฉัน 5 ไบต์!

เวอร์ชั่นใหม่

'\,:,s_el-mR

นี้เป็นอาร์เรย์ของสตริงต่อไปนี้รูปแบบA, AB, ABCและอื่น ๆ มันแบนและเลือกตัวละครแบบสุ่ม เนื่องจากสตริงนี้มี 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 สามารถเข้าใจว่ามันทำงานอย่างไร
trichoplax

1
ฉันจะไปแล้วฉันก็รู้ว่าคนที่อยู่เหนือฉันทำสิ่งเดียวกันในรหัสของเขาและให้ผู้อธิบายในเชิงลึก
user5957401

เป็นเรื่องดีที่คุณได้เพิ่มคำอธิบาย - ลำดับที่โซลูชันปรากฏบนหน้าเว็บอาจแตกต่างกันไปตามคะแนนเสียงที่ได้รับดังนั้นคำว่า "ด้านบน" อาจไม่อยู่ด้านบนในภายหลัง
trichoplax

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ถึงค่า exponent ที่เข้ารหัสเป็น 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

@Mego โอ้ใช่ถ้าคุณสามารถทำเช่นนั้นฉันเพิ่งจะเล่นกอล์ฟดังนั้นฉันไม่คุ้นเคยกับสิ่งที่ถือว่าเป็นผลลัพธ์ที่ยอมรับได้
Lemon Drop

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)

ความน่าจะเป็นที่จะยอมให้ตัวอักษรแต่ละตัวเป็นดัชนีที่ใช้ 1 ตัวอักษรหารด้วย 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 รัน (รหัสเครดิตแก่ Dennis)


คุณเรียนรู้ที่จะเก่งเยลลี่ที่ไหน? ฉันพบว่ามันยากที่จะเชื่อว่า Jelly จะเป็นความรู้ทั่วไปนอก PPCG
Addison Crump

1
@Syxer ฉันเพียงแค่มองไปที่วิกิพีเดียและทุบออกไป - ยังคงไม่ได้รับทั้งหมดของมัน :)
โจนาธานอัลลัน

1
ดีละถ้าอย่างนั้น. ยินดีต้อนรับสู่ PPCG ได้รับการโหวต
Addison Crump

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

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 ^ แรนด์ที่จะเท่ากับจำนวนเต็มจาก 1 ถึง 26

รุ่นเก่า 45 ไบต์

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

ความแม่นยำที่ จำกัด ของเลขจำนวนเต็ม TI-Basic จำกัด การแจกแจงแบบปกติสำหรับการสร้างตัวเลขภายใน µ ±7.02σ (ดูrandNorm() ดังนั้นเราจึงได้ค่าสัมบูรณ์ของตัวเลขสุ่มด้วย µ 0 และσ 1 คูณด้วยสี่เพื่อเพิ่มช่วงการใช้งานจริงที่กล่าวถึงก่อนหน้าเป็น to ±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ของ$aคือ 351 แต่คุณเลือกเฉพาะอักขระสุ่มจากอักขระ$x(26) ตัวแรก คุณสามารถแก้ไขและรักษาความน่าจะเป็นของคุณด้วยการเปลี่ยนครั้งสุดท้าย$xเป็น350+1 ไบต์ นี่คือ 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เพื่อย้ายไปที่ ต่อไป. ส่วนที่เหลือของ?แต่ละคนมีโอกาส1/4ในการพิมพ์จดหมายที่อยู่ด้านล่าง1/4เพื่อลองอีกครั้ง1/4ย้ายไปที่จดหมายถัดไป1/4ย้ายไปที่ก่อนหน้า อีกครั้งน่าจะเป็นของการพิมพ์ต่อ A เป็นจำนวนมากสูงกว่าพิมพ์ซี

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

Befunge, 186 ไบต์

เห็นได้ชัดว่าจะไม่ชนะกับเรื่องนี้ แต่ฉันคิดว่ามันเป็นคำตอบที่น่าสนใจกระนั้น :)

vและ>เลื่อนเคอร์เซอร์ลงตามลำดับและไปทางขวา ?ผู้ประกอบการส่งออกเคอร์เซอร์ในหนึ่งในสี่ทิศทางแบบสุ่ม ครั้งแรก?คือ "บล็อก" โดยvและ>ในสองทิศทางดังนั้นจึงมีเพียงสองทางที่จะไป: ?ทั้งการพิมพ์หรือลงไปถัดไป ดังนั้นจากคนแรก?มีโอกาส 50% ที่จะพิมพ์ A

ถัดไป?มีโอกาส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

aka 65 คูณ A, 66 คูณ B, 67 คูณ C ...

แล้วมันจะเลือกตัวละครแบบสุ่มในนั้น


ทำไมคุณเริ่มที่ 65
gcampbell

1
@gcampbell 65 อยู่Aใน ascii คุณสามารถเริ่มต้นจาก 1 แต่จากนั้นวงภายในจะกลาย{65..$[#i]}เป็น 1 char อีกต่อไป
izabera

2

CJam, 11 ไบต์

4.mrmqC*'A+

หรือ

676.mrmq'A+

ลองออนไลน์!

วิธีนี้คล้ายกับแนวคิดของ Luis และสร้างการกระจายแบบไม่สม่ำเสมอโดยการหาสแควร์รูทของตัวแปรสุ่ม


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

Matlab, 22

มักจะส่งคืนตัวอักษรตัวแรก แต่ในทางทฤษฎีสามารถสัมผัสได้ทั้งหมด!

ใช้เวลาหนึ่งแบ่งโดยตัวเลขสุ่ม จำกัด ไว้ที่ 26 และเปลี่ยนเป็นอักขระ

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

ไม่สั้นมากนัก แต่บางทีแนวคิดอาจเป็นแรงบันดาลใจให้กับคำตอบอื่น ๆ


ไม่randกลับมาเป็นค่าใน [0, 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

CJam, 10 ไบต์

CJam เข้าใกล้ # 3 ...

26mr)mr'A+

ลองออนไลน์!

นี้จะสร้างตัวเลขสุ่มสม่ำเสมอxระหว่างวันที่ 1 และ 26 และจากนั้นจะใช้ในการสร้างตัวเลขสุ่มสม่ำเสมอระหว่าง0และที่จะถูกเพิ่มx-1 Aอคตินี้ส่งผลต่อตัวละครที่เล็กกว่า


2

เขาวงกต , 19 ไบต์

__v6%_65+.@
" )
"^2

ลองออนไลน์!

นี่คือลูปที่แต่ละการวนซ้ำก) เพิ่มตัวนับที่เริ่มต้นที่ศูนย์หรือ b) ยุติซึ่งทั้งสองมีความน่าจะเป็น 50% ในตอนท้ายของวงที่เคาน์เตอร์จะได้รับการโมดูโล 26 และเพิ่มถึง 65 เพื่อให้ตัวอักษรระหว่างและAZ

นี้จะช่วยให้ความน่าจะเป็นสำหรับAเพียงเล็กน้อยกว่า 50% Bเพียงเล็กน้อยกว่า 25% และอื่น ๆ ได้ถึงZเพียงเล็กน้อยกว่า 1/2 26 ในทางทฤษฎีมีความเป็นไปได้ของการดำเนินการนี้ตลอดไป แต่เหตุการณ์นี้มีความน่าจะเป็นศูนย์ตามที่กำหนดโดยการท้าทาย (ในทางปฏิบัติที่อาจเป็นไปไม่ได้อยู่แล้วเพราะ PRNG จะส่งคืน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.