Golf ngẫu nhiên trong ngày # 7: Một nhân vật ngẫu nhiên khác biệt


47

Giới thiệu về bộ

Đây là một mục khách cho loạt trò chơi Golf ngẫu nhiên trong ngày.

Trước hết, bạn có thể coi điều này giống như bất kỳ thử thách golf mã nào khác, và trả lời nó mà không phải lo lắng về loạt bài này. Tuy nhiên, có một bảng xếp hạng trên tất cả các thách thức. Bạn có thể tìm thấy bảng xếp hạng cùng với một số thông tin khác về loạt bài trong bài đầu tiên .

Đầu vào

Không có đầu vào được thực hiện.

Đầu ra

Một chữ cái duy nhất của bảng chữ cái (trường hợp không liên quan), với một dòng mới tùy chọn. Mỗi chữ cái phải có xác suất khác không được chọn và tất cả 26 xác suất phải khác biệt . Để loại bỏ tất cả sự mơ hồ: Khác biệt có nghĩa là không được có hai xác suất bằng nhau.

Chấm điểm

Đây là mã golf. Mã ngắn nhất trong byte thắng.

Một mục hợp lệ là một chương trình hoặc chức năng đầy đủ có xác suất không kết thúc.

Bảng chữ cái

Để tránh nhầm lẫn, bảng chữ cái cụ thể được sử dụng là bảng chữ cái Latinh:

Hoặc

ABCDEFGHIJKLMNOPQRSTUVWXYZ

hoặc là

abcdefghijklmnopqrstuvwxyz

Bạn có thể chọn xuất chữ hoa hoặc chữ thường Ngoài ra, bạn có thể chọn xuất các trường hợp khác nhau trên các lần chạy khác nhau nếu điều đó có ích. Xác suất cho một chữ cái đã cho là xác suất của chữ cái đó xuất hiện trong cả hai trường hợp (trên hoặc dưới).

Giải trình

Vì nó hoàn toàn không rõ ràng từ đầu ra, vui lòng bao gồm một lời giải thích rõ ràng về cách bạn đạt được 26 xác suất khác biệt.

Bảng xếp hạng

(từ đây )

Bài đầu tiên của loạt bài cũng tạo ra một bảng xếp hạng tổng thể.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu mọi câu trả lời bằng tiêu đề, sử dụng mẫu Markdown sau:

## Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

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

(Ngôn ngữ hiện không được hiển thị, nhưng đoạn mã yêu cầu và phân tích nó và tôi có thể thêm bảng xếp hạng ngôn ngữ trong tương lai.)


Làm thế nào bạn sẽ đo 26 xác suất khác nhau? bằng cách chạy chương trình 26 lần?
BẠN

1
@ Bạn có thể xem qua các giải pháp - có một vài cách tiếp cận khác nhau với những giải thích tuyệt vời
trichoplax

Nếu nó là một chức năng, nó cần phải in hoặc nó chỉ có thể trả về giá trị ký tự?
Geoff Reedy

@Geoff Theo mặc định của chúng tôi cho đầu vào và đầu ra , in ra STDOUT hoặc trả về một ký tự đều ổn.
trichoplax

@Geoff lưu ý rằng nó phải là một ký tự, không chỉ là một giá trị số đại diện cho nó. Ví dụ, Athay vì 65.
trichoplax

Câu trả lời:


13

Bình thường, 5

Os._G

Hãy thử nó ở đây

Tính các tiền tố của bảng chữ cái, vì vậy : ["a", "ab", "abc", ..., "abcdefghijklmnopqrstuvwxyz"]. Sau đó làm phẳng danh sách và chọn một yếu tố ngẫu nhiên từ nó một cách thống nhất. Điều này có nghĩa là kể từ khi axuất hiện 26 lần, trong khi bxuất hiện 25 lần, tất cả các cách zchỉ với 1 lần xuất hiện, mỗi chữ cái có một cơ hội xuất hiện khác nhau. Tổng chuỗi có 351 ký tự.


1
Tôi thích câu trả lời đó. Rất thông minh.
Allen Fisher

24

MATL, 6 nhân vật

1Y2Xr)

Giải trình:

XrLấy số ngẫu nhiên được phân phối bình thường )Sử dụng số này để lập chỉ mục vào ... 1Y2Bảng chữ cái

Phân bố đối xứng quanh 0 và dịch số sang char đối xứng khoảng 0,5. Vì vậy, xác suất nên được phân biệt.


2
Ồ, ý tưởng rất hay để sử dụng phân phối Gaussian!
Luis Mendo

1
Ngôn ngữ "tốt nhất" cho công việc, vẫn bị đánh bại bởi thạch. Giải pháp tuyệt vời mặc dù.
Phượng hoàng Socratic

19

05AB1E , 6 byte

A.pJ.R

Giải trình

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

Bây giờ chúng ta có chuỗi sau:

aababcabcdabcdeabcdefabcdefgabcdefghabcdefghiabcdefghijabcdefghijkabcdefghijklabcdefghijklmabcdefghijklmnabcdefghijklmnoabcdefghijklmnopabcdefghijklmnopqabcdefghijklmnopqrabcdefghijklmnopqrsabcdefghijklmnopqrstabcdefghijklmnopqrstuabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvwabcdefghijklmnopqrstuvwxabcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyz

Sau đó, chúng tôi chọn một yếu tố ngẫu nhiên bằng cách sử dụng .R.

Xác suất

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%

Hãy thử trực tuyến! .


18

Thạch , 5 byte

ØA»ẊX

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Ø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ý lịch

Hãy L 0 , ..., L 25 biểu thị các chữ cái của bảng chữ cái theo thứ tự tự nhiên của họ, và S 0 , ..., S 25 một thống nhất một cách ngẫu nhiên hoán vị được lựa chọn của L . Xác định dãy hữu hạn M theo M n = max (L n , S n ) .

Sửa n trong 0, 18 và xác định k là chỉ số sao cho L n = S k .

Với xác suất 1/26 , L n = S nn = k , vì vậy M n = L nL n occurrs lần trong M .

Với xác suất 25/26 , L n ≠ S nn ≠ k . Trong trường hợp này, sau đây xảy ra.

  • Với xác suất n / 25 , S n là một trong L 0 , Mạnh, L n - 1 , do đó L n > S nM n = L n .

  • Một cách độc lập, cũng với xác suất n / 25 , k là một trong 0, cách n - 1 , do đó S k > L kM k = S k = L n .

Do đó, số lần xuất hiện dự kiến ​​của L n trong M1/26 + 25/26 · (n / 25 + n / 25) = (2n + 1) / 26 .

Cuối cùng, nếu bây giờ chúng ta chọn một thuật ngữ m của M một cách ngẫu nhiên, chữ L n chúng ta được chọn với xác suất (2n + 1) / 26/26 = (2n + 1) / 676 .

Điều này mang lại sự phân phối xác suất sau đây.

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

Bạn có thể xác minh thực nghiệm phân phối bằng cách gọi liên kết 100.000 lần (mất vài giây).


1
@RobertFraser bước shuffle-and -ield tạo ra một danh sách với A bất cứ nơi nào A xuất hiện trong danh sách, một B trong đó B xuất hiện trong danh sách và bất kỳ thứ gì ngoài A trong danh sách khác, ... một Z bất cứ nơi nào Z xuất hiện trong cả hai danh sách. do đó, có khoảng 52x nhiều A như Z trong kết quả.
Sparr

1
@RobertFraser Tôi đã thêm một lời giải thích.
Dennis

2
@DennisJaheruddin Trong UTF-8, vâng. Tuy nhiên, Jelly sử dụng một trang mã tùy chỉnh mã hóa tất cả các ký tự mà nó hiểu là một byte đơn lẻ. Các liên kết byte trong tiêu đề trỏ đến nó.
Dennis

2
Tôi thấy, khi tôi đọc lời giải thích, không rõ ràng ngay lập tức rằng bạn cũng không thể tận dụng phạm vi UTF-8 thông thường. Vì vậy, tôi có đúng không khi cho rằng bằng cách thay đổi trình thông dịch và ánh xạ tất cả các ký tự thành các ký tự UTF-8 cá nhân, bạn sẽ có mã hoàn toàn giống nhau (chỉ cần đọc / đánh máy ít hơn)? - Nếu vậy, hãy xem xét mở rộng giải thích để đề cập rằng một char nên tính cho một byte cho mục đích chơi gôn.
Dennis Jaheruddin

2
@DennisJaheruddin Như đã giải thích trong README (liên kết đầu tiên trong tiêu đề), trình thông dịch có hai chế độ (trang mã Jelly và UTF-8), vì vậy bạn có thể lưu chương trình này trong tệp 5 byte thực tế. Tôi có thể thêm tất cả thông tin đó vào mỗi câu trả lời tôi viết, nhưng có hàng trăm trong số đó, vì vậy tôi đã chọn liên kết thay thế.
Dennis

14

MATL , 10 byte

1Y2rU26*k)

Hãy thử trực tuyến!

Mã này tạo ra một biến ngẫu nhiên thống nhất trên khoảng (0,1) ( r) và tính bình phương của nó ( U). Điều này dẫn đến mật độ xác suất không đồng đều, giảm. Nhân với 26 ( 26*) đảm bảo rằng kết quả nằm trong khoảng (0,26) và làm tròn xuống ( k) tạo ra các giá trị 0,1, ..., 25 với xác suất giảm. Giá trị được sử dụng như một chỉ mục ( )) vào bảng chữ cái in hoa ( 1Y2). Vì MATL sử dụng lập chỉ mục mô-đun dựa trên 1, 0 tương ứng với Z, 1 đến A, 2 đến B, v.v.

Như một minh họa rằng các xác suất là khác biệt, đây là một biểu đồ rời rạc do 1000000 hiện thực ngẫu nhiên. Biểu đồ được tạo ra bằng cách chạy này trong Matlab:

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

nhập mô tả hình ảnh ở đây


1
Đẹp! Giải pháp tốt nhất tôi có thể đưa ra là 16 byte
DJMcMayhem

1
@DJMcMayhem Cách tiếp cận tốt đẹp!
Luis Mendo

Có thể, nhưng lâu hơn rất nhiều. : P
DJMcMayhem

Một cách thay thế thú vị khác: matl.suever.net/ trên
Suever

Thật ra bạn không cần k! Nhận thấy rằng trong khi thử codegolf.stackexchange.com/a/89648/11159
Dennis Jaheruddin

13

Java 7, 62 57 56 byte

5 byte nhờ Poke.

1 byte nhờ 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);}

Nghĩa là nó!

Biểu đồ tần suất (1e6 chạy, hệ số tỷ lệ 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
Tôi không nghĩ bạn cần đánh máy chữ đến int
Chọc

@Poke Cảm ơn, đã chơi golf.
Leaky Nun

Bạn có thể lưu một byte bằng cách di chuyển 676 bên ngoài dấu ngoặc đơn không?
trichoplax

@trichoplax Ý bạn là gì?
Nữ tu bị rò rỉ

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

10

Perl, 24 byte

-4 byte nhờ @Martin Ender
-1 byte nhờ @Dom Hastings

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

Cần -M5.010hoặc -Eđể chạy:

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

Chạy đoạn mã sau sẽ hiển thị sự xuất hiện của mỗi chữ cái:

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


Cách thức hoạt động : Tôi đoán mã khá rõ ràng, nhưng vẫn: nó chọn một số ngẫu nhiên giữa 0rand 26. Vì vậy, có nhiều khả năng cao hơn là các số gần với 0(chữ cái A) được chọn.


Lời giải thích có ý nghĩa với tôi :)
trichoplax

Giải pháp tốt đẹp! Bạn có thể lưu 1 byte bằng cách sử dụng danh sách trống và +:say+(A..Z)[rand rand 26]
Dom Hastings

@DomHastings aarf, tôi thật ngốc. Tôi đã thử (A..Z)[...]và nó không hoạt động, vì vậy tôi nghĩ rằng tôi có thể sử dụng một mảng ẩn danh như thế, nhưng đó chỉ là vì say.. cảm ơn! :)
Dada

10

PHP, 44 36 29 27 byte

Vượt qua 44 vẫn là 44 thường xuyên (

Cảm ơn insertusernamehere, Petah và Crypto vì tất cả sự giúp đỡ

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

Nó chọn một số ngẫu nhiên trong khoảng từ 0 đến 675 (= 26 2 -1), lấy căn bậc hai của nó và lấy nó ( chrhàm chuyển đổi đối số của nó thành một số nguyên). Vì các ô vuông có các khoảng khác nhau giữa chúng, nên xác suất của mỗi số được chọn là khác nhau. Mỗi n được chọn với xác suất (2n + 1) / 676.

Thêm 65 vào số này cung cấp cho bạn một ký tự ngẫu nhiên từ Ađến Z.

Mã của mã chạy 1.000.000 lần


Bạn có thể chơi golf 4 byte : range(A,Z).
insertusernamehere

@insertusernamehere: Cảm ơn vì tiền boa, nhưng tôi đã có thể chơi golf 8 byte bằng cách không sử dụng phạm vi nào cả và chỉ sử dụng chr().
Mèo kinh doanh

3
Thậm chí còn tốt hơn. Thật không may gạch bỏ 44 vẫn là 44 thường xuyên . :)
insertusernamehere

1
@insertusernamehere Bạn từ bỏ quá dễ dàng :-)<s>&nbsp;44&nbsp;</s>
MonkeyZeus

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

8

R, 40 27 byte

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

Điều này sẽ lấy 1số từ các 26số được tạo với xác suất tăng dần về phía Z, mà không thay thế và hiển thị một chữ cái chỉ số là số này, từ danh sách các chữ cái viết hoa LETTERS.

Các đối số của samplehàm là:

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

Yup ', điều đó sẽ không làm việc. Có thể cho tôi một cách thông minh nhất!
Frédéric

Vâng, sẽ luôn luôn có một lớp lót ở đâu đó! Hãy nghĩ rằng 'hãy chờ nó ...
Frédéric

1
Đã sửa ngắn hơn - ấn tượng :)
trichoplax

1
@trichoplax Cảm ơn! Thử thách tốt đẹp btw!
Frédéric

1
@AlbertMasclans: Nó thực sự có thể, nhưng nó đã được thực hiện trong câu trả lời của người khác, vì vậy tôi không muốn "sao chép"! Nhưng dù gì cũng cảm ơn ! ;)
Frédéric

8

> <> , 14 byte

lx
;>dd+%'A'+o

> <> là ngôn ngữ 2D hình xuyến và phần xác suất riêng biệt chỉ xảy ra một cách tự nhiên do nguồn ngẫu nhiên duy nhất của ngôn ngữ. Hãy thử trực tuyến!

Các lệnh có liên quan là:

[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

Do đó, xác suất đầu ra là:

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 byte

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

Giải thích: điều này tạo ra một số dấu phẩy động ngẫu nhiên trong khoảng [0, 676), lấy căn bậc hai và sau đó xếp nó. Sau đó, nó thêm 65 (giá trị ascii của "A"), chuyển đổi nó thành char và in nó.

Điều này cho mỗi số từ 0 đến 25 một xác suất riêng biệt. Để hiểu tại sao, hãy nghĩ về nó như thế này. Có bao nhiêu số, bỏ qua các số nguyên, khi bạn lấy căn bậc hai và sàn cho 0? Chỉ một số sẽ (không). Điều này có nghĩa là số không có xác suất 1/676. Có bao nhiêu số sẽ tạo ra 1? 3 sẽ, 1, 2 và 3. Điều này có nghĩa là người ta có xác suất 3/676. Một hai có thể được tạo ra với 4, 5, 6, 7 hoặc 8, cho xác suất 5, ba có xác suất 7, v.v. và vì sự khác biệt giữa các ô vuông liên tiếp tăng đều đặn hai, mẫu này tiếp tục cho mỗi số tăng đến 25 (Z).

Lưu 1 byte nhờ nữ tu bị rò rỉ!


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

1
Bạn có thể làm chr(int(65+random()**.5*26)). Đó là điều tương tự đại số vì 26 == 676. và bây giờ thứ tự các hoạt động đứng về phía bạn
Wheat Wizard

3
@EamonOlive Đối với một byte khác **2*26có thể được sử dụng cho phân phối nghịch đảo.
dùng81655

1
1/random()%26cũng nên làm việc
xnor

1
@xnor đôi khi sẽ cho 1/0% 26
trichoplax

5

PowerShell v2 +, 33 31 byte

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

Đưa một phạm vi từ 65đến 90(tức là ASCII Ađến Z), dẫn nó qua một vòng lặp. Mỗi lần lặp, chúng tôi sử dụng toán tử dấu phẩy để tạo một mảng của phần tử đó nhân số đó. Ví dụ, điều này sẽ tạo ra 65 65giây, 66 66giây, 67 67giây, v.v. Mảng lớn đó được dẫn đến Get-Random(PRNG thống nhất) sẽ chọn một yếu tố. Vì có số lượng khác nhau của mỗi yếu tố, mỗi nhân vật có tỷ lệ phần trăm khác biệt được chọn. Sau đó chúng tôi gói gọn nó trong parens và đúc nó như một char. Đó là còn lại trên đường ống và đầu ra là ẩn.

(Cảm ơn @LeakyNun vì đã chơi gôn một vài byte ngay cả trước khi nó được đăng. D)


Xác suất

(làm tròn nhẹ để tôi có thể chứng minh Ptùy chọn của -ftoán tử 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
Tôi bắt đầu mà không nhìn vào bất kỳ câu trả lời nào; đã cố gắng xây dựng trên galđầu ra ( [char[]]"uz$(gal|out-string)"-cmatch'[a-z]'|random) có tới 50 ký tự, sau đó 48, chuyển sang số và nhận được 42, sau đó 31 và dừng ở đó; nhìn vào bảng xếp hạng để xem nơi đó sẽ đưa tôi. Ngay tại đây. Nhân vật cho nhân vật giống hệt nhau. Welp, tôi có lẽ không thể đánh bại điều đó.
TessellatingHeckler

5

CJam, 21 17 12 byte

Cảm ơn Martin Ender đã tiết kiệm cho tôi 5 byte!

Phiên bản mới

'\,:,s_el-mR

Điều này tạo nên một mảng các chuỗi sau đây mô hình A, AB, ABC, và vân vân. Nó làm phẳng nó và chọn một nhân vật ngẫu nhiên. Vì chuỗi này chứa 26 A, 25 B, 24 C, v.v., mỗi chữ cái có xác suất được chọn riêng biệt.

Hãy thử trực tuyến!

Giải trình

'\,          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

Phiên bản cũ

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

Có được xác suất riêng biệt bằng cách tạo một chuỗi trong đó mỗi chữ cái xuất hiện một số lần bằng với vị trí của nó trong bảng chữ cái.

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 byte

sample(LETTERS,1,,1:26)

Chỉ cần 'mẫu' một lá thư từ nội dung. đó 1:26là một vectơ trọng số cho mỗi chữ cái một xác suất khác nhau.


1
1:26là một vectơ trọng số cho mỗi chữ cái
user5957401

Điều đó làm cho nó một câu trả lời hợp lệ. Thật đáng để chỉnh sửa trong một lời giải thích để những người không quen thuộc với R có thể hiểu cách thức hoạt động của nó.
trichoplax

1
Tôi đang đi, và sau đó tôi nhận ra rằng người ở trên tôi đã làm nhiều điều tương tự trong mã của anh ta và đưa ra một người giải thích sâu sắc.
dùng5957401

Thật tốt khi bạn đã thêm một lời giải thích - thứ tự các giải pháp xuất hiện trên trang có thể thay đổi khi số phiếu được đưa vào để những người "ở trên" có thể không ở trên sau này.
trichoplax

5

C, 35 byte

Chương trình này giả định RAND_MAXlà (2 ^ 32/2) - 1 vì nó là trên gcc theo mặc định. Biên dịch với -lmcờ để liên kết sqrtchức năng. Đầu ra được ghi vào thiết bị xuất chuẩn dưới dạng chữ in hoa mà không theo dõi dòng mới.

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

Tùy chọn, nếu RAND_MAXlà (2 ^ 16/2) - 1, có thể sử dụng phiên bản 32 byte ngắn hơn:

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

Để giải trí, tôi cũng đã tạo một phiên bản không sử dụng sqrthàm hoặc yêu cầu thư viện toán học đi kèm (phiên bản này phải có RAND_MAX(2 ^ 32/2) - 1), nhưng cuối cùng nó vẫn dài hơn mặc dù tôi nghĩ rằng đó là tuyệt đấy:

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

Giải trình

[Chương trình đầu tiên]

Trong hai đầu tiên sử dụng sqrt, chức năng đơn giản là bản đồ phạm vi [0, RAND_MAX)để [0, 25]qua chia, và sau đó thêm 65 (ASCII A) với giá trị chuyển nó vào bảng chữ cái ASCII trước khi xuất nó.

[Chương trình thứ hai]

Chương trình thứ hai phức tạp hơn một chút vì nó thực hiện một chiến lược tương tự, nhưng không có sqrttoán tử. Do các bit số mũ của một dấu phẩy động được tự động tính toán khi gán một số nguyên, nên chúng có thể được sử dụng một cách hiệu quả như một cách thô sơ để lấy logarit cơ sở 2 của một số.

Vì chúng tôi chỉ muốn phạm vi lên tới RAND_MAXgiá trị lũy thừa được mã hóa là 25, nên phép tính (2 ^ 32/2 - 1) / (2 ^ 25) cho chúng tôi chỉ khoảng 64, được sử dụng trong quá trình phân chia randđể ánh xạ nó đến phạm vi mới này. Tôi cũng đã thêm 1 vào giá trị vì biểu diễn dấu phẩy động của 0 khá kỳ lạ và sẽ phá vỡ thuật toán này.

Tiếp theo, float được loại hình thành một số nguyên để cho phép bẻ khóa và các hoạt động khác như vậy. Vì trong các số dấu phẩy động của IEEE 754, các bit số mũ là các bit 30-23, sau đó số này được dịch sang phải 23 bit, cắt bỏ phần tử và cho phép đọc giá trị số mũ thô dưới dạng số nguyên. Xin lưu ý rằng bit dấu cũng nằm ngoài bit lũy thừa, nhưng vì không bao giờ có bất kỳ tiêu cực nào nên nó không phải bị che đi.

Tuy nhiên, thay vì thêm 65 vào kết quả này như chúng tôi đã làm trước đây, số mũ của dấu phẩy động được biểu diễn dưới dạng số nguyên 8 bit không dấu từ 0 đến 255, trong đó giá trị số mũ của 0 là 127 (Chỉ cần trừ 127 để lấy giá trị số mũ "đã ký" thực tế ). Vì 127 - 65 là 62, thay vào đó, chúng ta chỉ cần trừ 62 để chuyển nó ra khỏi phạm vi số mũ của dấu phẩy động này và vào phạm vi bảng chữ cái ASCII trong một thao tác.

Phân phối

Tôi không phải là chuyên gia toán học nên tôi không thể nói chắc chắn công thức chính xác cho các phân phối này, nhưng tôi có thể (và đã) kiểm tra mọi giá trị trên phạm vi [0, RAND_MAX)để chỉ ra rằng khoảng cách giữa nơi một phạm vi chữ cái kết thúc và bắt đầu khác không bao giờ là tương tự. (Lưu ý các thử nghiệm này giả định (2 ^ 32/2) - 1) tối đa ngẫu nhiên)

[Chương trình đầu tiên]

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

[Chương trình thứ hai]

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

Sẽ không ngắn hơn nếu chỉ trả lại thứ tự hơn là in nó? Vì charlà một loại tích phân trong C, nên được chấp nhận.
Mego

@Mego Oh yeah yeah nếu bạn có thể làm điều đó, tôi chỉ mới chơi golf nên tôi không quá quen thuộc với những gì được coi là đầu ra chấp nhận được.
Lemon Drop

4

Python 2, 72 byte

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

Nhân bội ký tự theo giá trị ascii của nó, sau đó chọn ngẫu nhiên một ký tự từ chuỗi kết quả.

Dưới đây là xác suất cho mỗi chữ cái được chọn, tính theo tỷ lệ phần trăm:

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

Hãy dùng thử: https://repl.it/Cm0x


4

Thạch , 5 byte

ØAxJX

(Điểm bằng nhau, nhưng là một phương pháp khác , đối với giải pháp Jelly hiện có của Dennis.)

Xác suất đạt được mỗi chữ cái là chỉ số dựa trên 1 trong bảng chữ cái chia cho 351 - số tam giác thứ 26:

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

Vì 1 + 2 + ... + 26 = 351, P (chữ cái) = 1.

Thực hiện:

Ø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

Kiểm tra nó trên TryItOnline hoặc nhận phân phối 100 nghìn lượt chạy (mã tín dụng cho Dennis)


Bạn học ở đâu để giỏi Jelly? Tôi thấy khó tin rằng Jelly sẽ là kiến ​​thức phổ biến ngoài PPCG.
Addison Crump

1
@Syxer Tôi chỉ nhìn vào wiki và bash đi - vẫn không nhận được tất cả :)
Jonathan Allan

1
Vậy thì tốt. Chào mừng bạn đến với PPCG, có một cuộc bỏ phiếu lên.
Addison Crump

3

q, 38 byte

Không đặc biệt ngắn nhưng ...

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

Hàm phân phối tích lũy rời rạc là chuỗi

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

Và chúng tôi chỉ đơn thuần là mẫu từ phân phối.


3

JavaScript (ES6), 45 byte

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

Đạt được phân phối không đồng đều bằng cách bình phương giá trị ngẫu nhiên. Math.random()trả về một số float của phạm vi [0,1)để kết quả bình phương này có xu hướng 0(hoặc a).

Kiểm tra


42 B,(n=Math.random(),10+26*n+n|0).toString(36)
Ephellon Dantzler

3

Oracle SQL 11.2, 212 byte

Sử dụng vị trí ký tự trong bảng chữ cái làm xác suất

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;

Không chơi gôn

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 byte

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

rand tạo ra một giá trị đồng nhất trong (0,1]. Điều này mang lại cho 26 ^ rand một xác suất khác để bằng các số nguyên từ 1 đến 26.

Phiên bản cũ hơn, 45 byte

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

Độ chính xác giới hạn của các số nguyên TI-Basic giới hạn các phân phối bình thường trong việc tạo ra các số trong phạm vi ± ± 7.02σ (xem randNorm(). Vì vậy, chúng tôi nhận được giá trị tuyệt đối của một số ngẫu nhiên với Số 0 và σ 1, nhân với bốn để tăng phạm vi thực tế được đề cập trước đó đến Câu ± 28,08σ. Sau đó, chúng tôi xếp tầng giá trị và thêm 1, vì sub(được lập chỉ mục 1, cung cấp cho chúng tôi phạm vi từ 1-29 với các xác suất khác nhau của mỗi loại.


1
@trichoplax Đó là sai lầm của tôi, tôi còn 30 so với phiên bản cũ là [0,29]. Tôi đã sửa nó bây giờ.
Timtech

Khoảng (0,1] được cho là [0,1).
kamoroso94

@ kamoroso94 Bạn đã kiểm tra chưa? "Lưu ý: Do đặc thù của thuật toán tạo số ngẫu nhiên, số nhỏ nhất có thể tạo ra lớn hơn 0. Số lớn nhất có thể thực sự là 1" - trích dẫn từ tibasicdev.wikidot.com/rand
Timtech

3

PHP, 92 84 byte

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

Xây dựng một chuỗi gồm tất cả các chữ cái, lặp lại số lần thông qua vòng lặp chúng ta và sau đó chọn một chữ cái từ chuỗi đó một cách ngẫu nhiên. Các chữ cái sau trong bảng chữ cái có xác suất cao hơn do kết quả

Cảm ơn insertusernamehere để cạo byte

xác suất kết quả (được sắp xếp theo%)

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
thay đổi để thực sự tuân thủ các quy tắc. Sai lầm của tôi
gabe3886

@insertusernamehere Tôi nhận được thông báo biến không xác định khi tôi chạy nó và không có đầu ra chữ cái
gabe3886

Oh tôi xin lỗi. Tôi nghĩ rằng tôi đã mang đi và loại bỏ $x=0đó là rõ ràng cần thiết. Đây là phiên bản 84 byte : for($i=65,$x=0;$i<91;$a.=str_repeat(chr($i++),$x))$x++;echo substr($a,rand(0,$x),1);Bạn đã bao giờ quản lý để có được giá trị lớn hơn Gkhi chạy mã của mình chưa? Dù sao, bạn luôn có thể bỏ qua notices khi chơi golf.
insertusernamehere

1
Tôi đã làm, nhưng phải mất một thời gian để trồng trọt. Tôi đã chạy nó qua khoảng 100 nghìn lần lặp để kiểm tra
gabe3886

Các strlensố $alà 351, nhưng bạn chỉ được chọn một nhân vật ngẫu nhiên trong số những người đầu tiên $x(26) ký tự. Bạn có thể sửa nó và giữ xác suất của bạn với sự thay đổi của trận chung kết $xthành 3501 byte. Đây là phiên bản 77 byte khắc phục sự cố nhưng cũng mang lại xác suất gần nhau hơn:for($i=65;$i<91;$a.=str_repeat(chr($i),$i++));echo substr($a,rand(0,2014),1);
Jo.

3

Befunge, 168 164 byte

Nhỏ gọn hơn lần đầu tiên, với một chút xác suất khác nhau: Lần đầu tiên ?1/4 cơ hội in A trên "lần thử đầu tiên", 2/4 cơ hội quay lại như cũ ?1/4 để chuyển sang kế tiếp. Phần còn lại của ?mỗi s có 1/4 cơ hội in chữ bên dưới chúng, 1/4 để thử lại, 1/4 chuyển sang chữ tiếp theo, 1/4 chuyển sang chữ trước. Một lần nữa, xác suất in A cao hơn rất nhiều so với in Z.

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

Befunge, 186 byte

Rõ ràng là sẽ không chiến thắng với điều này, nhưng tôi nghĩ dù sao đó cũng là một câu trả lời thú vị :)

v>điều khiển con trỏ tương ứng xuống dưới và sang phải. Các ?nhà điều hành sẽ gửi con trỏ ở một trong bốn hướng một cách ngẫu nhiên. Đầu tiên ?là "bị chặn" bởi v>theo hai hướng, vì vậy nó chỉ có hai cách để đi: Hoặc là in chữ A hoặc xuống theo hướng tiếp theo ?. Vì vậy, ngay từ lần đầu tiên, ?có 50% cơ hội in chữ A.

Tiếp theo ?1/3 cơ hội in B, 1/3 quay trở lại và 1/3 tiếp tục đi xuống. Vân vân.

Rõ ràng là các chữ cái cao hơn có cơ hội được in lớn hơn nhiều so với các chữ cái thấp hơn, nhưng tôi không chắc chắn chính xác cơ hội của mỗi chữ cái là gì.

Một số trợ giúp với toán chính xác sẽ được đánh giá cao :)

Ít nhất có 1/2 * 1/3 ^ 25 cơ hội con trỏ di chuyển xuống Z trong lần thử đầu tiên, nhưng tôi không chắc chắn khả năng con trỏ di chuyển lên xuống ảnh hưởng đến từng chữ cái như thế nào.

,@ in và thoát.

 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 byte

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

nó hoạt động bằng cách tạo chuỗi này:

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

aka 65 lần A, 66 lần B, 67 lần C ...

và sau đó nó chọn một nhân vật ngẫu nhiên trong đó


Tại sao bạn bắt đầu ở tuổi 65?
gcampbell

1
@gcampbell 65 đang Aở ascii. bạn có thể bắt đầu từ 1, nhưng sau đó vòng lặp bên trong sẽ {65..$[#i]}dài hơn 1 char
izabera

2

CJam, 11 byte

4.mrmqC*'A+

hoặc là

676.mrmq'A+

Hãy thử trực tuyến!

Giải pháp này tương tự như ý tưởng của Luis và tạo ra một phân phối không đồng nhất bằng cách lấy căn bậc hai của biến ngẫu nhiên.


2

Hàng loạt, 116 byte

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

Hoạt động bằng cách chọn lớn hơn hoặc nhỏ hơn (tôi quên cái nào) của hai biến ngẫu nhiên.


2

Matlab, 22

Sẽ thường trả lại các chữ cái sớm, nhưng về mặt lý thuyết có thể chạm vào tất cả chúng!

Làm cho một người bị lệch bởi một số ngẫu nhiên, giới hạn số này thành 26 và biến nó thành một ký tự.

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

Tất nhiên không phải là rất ngắn, nhưng có lẽ khái niệm này có thể truyền cảm hứng cho các câu trả lời khác.


randtrả về một giá trị trong [0, 1) không? Đó là, bao gồm không nhưng không bao gồm một. Nếu điều này đôi khi dẫn đến 1/0, min(1/0,26)vẫn sẽ trả về 26 hoặc lỗi?
trichoplax

Theo như tôi biết randtrả về một giá trị trong (0,1), do đó không nên có vấn đề
paul.oderso

1
@trichoplax Mặc dù bạn sẽ không thấy randreturn 0 trong thực tế, nhưng min(1/0,26)thực tế sẽ trả về 26.
Dennis Jaheruddin 17/8/2016

Trong trường hợp đó, giải pháp tốt đẹp :)
trichoplax

2

CJam, 10 byte

Cách tiếp cận của CJam # 3 ...

26mr)mr'A+

Hãy thử trực tuyến!

Điều này tạo ra một số ngẫu nhiên thống nhất xtrong khoảng từ 1 đến 26 và sau đó sử dụng số đó để tạo một số ngẫu nhiên đồng nhất giữa 0x-1được thêm vào A. Sự thiên vị này dẫn đến các nhân vật nhỏ hơn.


2

Mê cung , 19 byte

__v6%_65+.@
" )
"^2

Hãy thử trực tuyến!

Đây là một vòng lặp, ở mỗi lần lặp, a) sẽ tăng một bộ đếm bắt đầu từ 0 hoặc b) kết thúc, cả hai đều có xác suất 50%. Vào cuối vòng lặp, bộ đếm được lấy modulo 26 và thêm vào 65 để đưa ra một chữ cái giữa AZ.

Điều này đưa ra xác suất Achỉ hơn 50% Bmột chút , chỉ hơn 25% một chút và cứ như vậy Zchỉ hơn 1/2 26 một chút . Về lý thuyết, có khả năng điều này sẽ diễn ra mãi mãi, nhưng sự kiện này có xác suất bằng 0 theo yêu cầu của thử thách (trong thực tế điều đó có lẽ không thể xảy ra vì PRNG sẽ trả về cả hai kết quả có thể tại một thời điểm nào đó trong giai đoạn của nó).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.