text:
Random Golf of the Day #7: A distinctly random character
About the Series
This is a guest entry for the Random Golf of the Day series.
First off, you may treat this like any other code golf challenge, and answer it without worrying about the series at all. However, there is a leaderboard across all challenges. You can find the leaderboard along with some more information about the series in the first post.
Input
No input is taken.
Output
A single letter of the alphabet (case irrelevant), with an optional trailing newline. Each letter must have non-zero probability of being chosen, and all 26 probabilities must be distinct. To remove all ambiguity: Distinct means that there must not be two probabilities that are equal to each other.
Scoring
This is code golf. Shortest code in bytes wins.
A valid entry is a full program or function that has zero probability of not terminating.
Alphabet
To avoid confusion, the particular alphabet to be used is the Latin alphabet:
Either
ABCDEFGHIJKLMNOPQRSTUVWXYZ

or
abcdefghijklmnopqrstuvwxyz

You may choose to output upper case or lower case. Alternatively, you may choose to output different cases on different runs if that helps. The probability for a given letter is the probability of that letter appearing in either case (upper or lower).
Explanation
As it won't be at all obvious from the output, please include a clear explanation of how you achieved the 26 distinct probabilities.
Leaderboard
(from here)

var QUESTION_ID=89621,OVERRIDE_USER=20283;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="
"+e.body.replace(OVERRIDE_REG,"")+"
")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
 <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b">

Leaderboard

	Author	Language	Size

Winners by Language

Language	User	Score

{{PLACE}}	{{NAME}}	{{LANGUAGE}}	{{SIZE}}	Link

{{LANGUAGE}}	{{NAME}}	{{SIZE}}	Link

The first post of the series also generates an overall leaderboard.
To make sure that your answers show up, please start every answer with a headline, using the following Markdown template:
## Language Name, N bytes

where N is the size of your submission. If you improve your score, you can keep old scores in the headline, by striking them through. For instance:
## Ruby, <s>104</s> <s>101</s> 96 bytes

(The language is not currently shown, but the snippet does require and parse it, and I may add a by-language leaderboard in the future.)

how would you measure 26 distinct probabilities? by running program 26 times?

@YOU have a look through the solutions - there are a few different approaches with excellent explanations

If it is a function does it need to print or can it just return the character value?

@Geoff According to our defaults for input and output, either printing to STDOUT or returning a character are fine.

@Geoff note that it must be a character, not just a number value representing it. For example, A rather than 65.

Pyth, 5
Os._G

Try it here
Computes the prefixes of the alphabet, so: ["a", "ab", "abc", ..., "abcdefghijklmnopqrstuvwxyz"]. Then flattens the list and selects a random element from it uniformly. This means that since a appears 26 times, while b appears 25 times, all the way down to z with only 1 appearance, each letter has a different chance of appearing. The total string has 351 characters.

I like that answer. Very clever.

MATL, 6 Characters
1Y2Xr)

Explanation:
Xr Take a normally distributed random number
) Use this to index into...
1Y2 The alphabet
The distribution is symmetrical around 0, and the translation of number to char is symmetrical around 0.5. As such the probabilities should be distinct.

Oh, very good idea to use a Gaussian distribution!

"best" language  for the job, still beaten by jelly. Excellent solution though.

05AB1E, 6 bytes
Code
A.pJ.R

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

We now have the following string:
aababcabcdabcdeabcdefabcdefgabcdefghabcdefghiabcdefghijabcdefghijkabcdefghijklabcdefghijklmabcdefghijklmnabcdefghijklmnoabcdefghijklmnopabcdefghijklmnopqabcdefghijklmnopqrabcdefghijklmnopqrsabcdefghijklmnopqrstabcdefghijklmnopqrstuabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvwabcdefghijklmnopqrstuvwxabcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyz

After that, we pick a random element using .R.
The probabilities
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%

Try it online!.

Jelly, 5 bytes
ØA»ẊX

Try it online!
How it works
Ø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.

Background
Let L0, …, L25 denotes the letters of the alphabet in their natural order, and S0, …, S25 a uniformly at random selected permutation of L. Define the finite sequence M by Mn = max(Ln, Sn).
Fix n in 0, … 25 and define k as the index such that Ln = Sk.
With probability 1 / 26, Ln = Sn and n = k, so Mn = Ln and Ln occurrs once in M.
With probability 25 /26, Ln ≠ Sn and n ≠ k. In this case, the following happens.

With probability n / 25, Sn is one of L0, …, Ln - 1, so Ln > Sn and Mn = Ln.
Independently, also with probability n / 25, k is one of 0, … n - 1, so Sk > Lk and Mk = Sk = Ln.

Thus, the expected number of occurrences of Ln in M is 1/26 + 25/26 · (n/25 + n/25) = (2n + 1)/26.
Finally, if we now select a term m of M uniformly at random, the letter Ln we be chosen with probability (2n + 1)/26 / 26 = (2n + 1)/676.
This yields the following distribution of probabilities.
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

You can empirically verify the distribution by calling the link 100,000 times (takes a few seconds).

Even the probability estimating code is in Jelly... :)

How does this get a different probability for each letter?

@RobertFraser the shuffle-and-yield step produces a list with an A anywhere an A appeared in either list, a B where a B appeared in either list and anything other than A in the other list, ... a Z anywhere that Z appeared in both lists. so there are approx 52x as many A as Z in the result.

Stole the distribution chain, hope you don't mind.

@RobertFraser I've added an explanation.

@JonathanAllan Not at all. I made a typo btw. It's 100K, not 10K.

Thanks - surprised I didn't spot that 10^5!=10^4

Isn't this 5 chars but 9 bytes? https://mothereff.in/byte-counter

@DennisJaheruddin In UTF-8, yes. However, Jelly uses a custom code page that encodes all the characters it understands as a single byte each. The bytes link in the header points to it.

I see, when I read the explanation it was not immediately clear that you cannot take advantage of the regular UTF-8 range as well. So, am I right to assume that by changing the interpreter and mapping all characters onto individul UTF-8 characters you would have completely identical code (just less readable/typable)? -- If so, consider expanding the explanation to mention that a char should count for a byte for golf purposes.

@DennisJaheruddin As explained in the README (first link in the header), the interpreter has two modes (Jelly code page and UTF-8), so you can save this program in an actual 5-byte file. I could add all that information to every answer I write, but there are hundreds of them, so I chose linking instead.

@Dennis My recommended addition was actuallly for the page that you link to (assuming you control that page), of course it is not needed in each individual answer.

MATL, 10 bytes
1Y2rU26*k)

Try it online!
The code generates a uniform random variable on the interval (0,1) (r) and computes its square (U). This results in a non-uniform, decreasing probability density. Multiplying by 26 (26*) ensures that the result is on the interval (0,26), and rounding down (k) produces the values 0,1,...,25 with decreasing probabilities. The value is used as an index ())  into the uppercase alphabet (1Y2). Since MATL uses 1-based modular indexing, 0 corresponds to Z, 1 to A, 2 to B etc.
As an illustration that the probabilities are distinct, here's a discrete histogram resulting from 1000000 random realizations. The graph is produced by running this in Matlab:
bar(0:25, histc(floor(26*rand(1,1e6).^2), 0:25))

Nice! The best solution I could come up with is 16 bytes

@DJMcMayhem Nice approach!

Maybe, but a lot longer. :P

Another fun alternative: https://matl.suever.net/?code=lY2toY%22lZr&inputs=&version=18.7.0

Actually you dont need the k ! Noticed that whilst trying http://codegolf.stackexchange.com/a/89648/11159

And it resulted in this.

@Suever I considered using a weight vector as input to randsample, but your idea is better!

Java 7, 62 57 56 bytes
5 bytes thanks to Poke.
1 byte thanks to 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);}
Ideone it!
Frequency diagram (1e6 runs, scaling factor 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: ***************************************************************************

I don't think you need to typecast to int

@Poke Thanks, golfed.

Can you save a byte by moving the 676 outside the parentheses?

@trichoplax What do you mean?

sqrt(x*y*y) = sqrt(x)*y

Perl, 24 bytes
-4 bytes thanks to @Martin Ender
-1 byte  thanks to @Dom Hastings
say+(A..Z)[rand rand 26]

Needs -M5.010 or -E to run :
perl -E 'say+(A..Z)[rand rand 26]'

Running the following code will show the occurrence of each letter :
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

How it works : I guess the code is pretty explicit, but still : it chooses a random number between 0 and rand 26. So there is a much higher probability that numbers close to 0 (letter A) are choosen.

The explanation makes sense to me :)

Nice solution! You can save 1 byte using a bare list and +: say+(A..Z)[rand rand 26]

@DomHastings aarf, I'm stupid. I tried (A..Z)[...] and it didn't work, so I thought I could use an anonymous array like that, but that was just because of the say.. thanks! :)

PHP, 44 36 29 27 bytes
Crossed out 44 is still regular 44 ;(
Thanks to insertusernamehere, Petah, and Crypto for all the help
<?=chr(65+rand(0,675)**.5);

It chooses a random number between 0 and 675 (=262-1), takes its square root, and floors it (the chr function converts its argument to an integer). Since the squares have different intervals between them, the probability of each number being chosen is distinct. Every n is chosen with probability (2n+1)/676.
Adding 65 to this number gives you a random character from A to Z.
Ideone of the code running 1,000,000 times

You can golf off 4 bytes: range(A,Z).

@insertusernamehere: Thanks for the tip, but I was able to golf 8 bytes by not using range at all and just using chr().

Even better. Unfortunately crossed out 44 is still regular 44. :)

@insertusernamehere You give up too easily :-) <s> 44 </s>

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

@Petah: Thanks! Didn't occur to me that chr converts to int.

What about : <?=chr(65+sqrt(rand()%675));

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

<?=chr(65+log(rand(),2.3)); as alternative solution with the same byte count

R, 40 27 bytes
LETTERS[sample(26,1,,1:26)]

This will take 1 number from 26 numbers generated with growing probability toward Z, without replacing, and display a letter the index of which is this number, from the list of uppercase letters LETTERS.
The arguments of the sample function are :
sample(
       26, #How many numbers to generate
        1, #How many numbers to sample
         , #Replacing ? Here, no by default
     1:26, #Weight of probabilities
       )

Yup', that won't work. There might me a cleverest way !

Well, there will always be a lining somewhere ! Gotta think 'bout it...

Fixed and shorter - impressive :)

@trichoplax Thanks ! Nice challenge btw !

Can be made shorter:    sample(LETTERS,1,,1:26)

@AlbertMasclans : It can indeed, but it has already been done in someone else's answer, so I don't want to "copy" ! But thanks anyway ! ;)

><>, 14 bytes
lx
;>dd+%'A'+o

 ><> is a toroidal 2D language, and the distinct probabilities part just naturally happens due to the language's only source of randomness. Try it online!
The relevant commands are:
[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

Thus the output probabilities are:
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

Python 2, 58 57 bytes
from random import*
print chr(int(65+(random()*676)**.5))

Explanation: this generates a random floating point number in the interval [0, 676), takes the square root and then floors it. Then it adds 65 (the ascii value of "A"), converts it to a char, and prints it.
This gives each number from 0 to 25 a distinct probability. To understand why, think about it like this. How many numbers, ignoring non-integers, when you take the square root and floor give 0? Only one number will (zero). This means that zero has a probability of 1/676. How many numbers will produce 1? 3 will, 1, 2, and 3. This means one has a probability of 3/676. A two can be produced with a 4, 5, 6, 7, or 8, giving it probability 5, a three has probability 7, etc. and since the difference between consecutive squares increases steadily by two, this pattern continues for every number up to 25 (Z).
1 byte saved thanks to leaky nun!

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

@leakynun that doesn't quite work since randint takes 2 arguments. I took one byte off though. Thanks!

You could do chr(int(65+random()**.5*26)).  Its the same thing algebraically because 26 == √676. and now order of operations is on your side

@EamonOlive For another byte **2*26 could be used for the inverse distribution.

1/random()%26 should also work.

@xnor that will sometimes give 1/0%26

gauss(0,1)%26 should so then, though the chance of reaching the later letters is vanishingly small.

@xnor I'm not sure that's shorter since you need abs also. I'll look into it.

@DJMcMayhem I don't think you need abs, the %26 works on negatives.

@xnor Yeah it does, but it will also cause numbers like 24 and 25 to be weighted equally to numbers like 0 and 1. Honestly, if you want to take the bulk of my answer and repost it with a gaussion distribution instead, I wouldn't mind. I don't have the time right now to verify all of these tips, find out which is shortest, update my explanation etc.

@DJMcMayhem Oh, good point about the symmetry. I see the MATL answer has a mean of 0.5, which fixes it and would cost a byte here. Given that it would basically be the same answer, I'll pass on posting it.

R, 23 bytes
sample(LETTERS,1,,1:26)

Just 'samples' a letter from a builtin. the 1:26 is a vector of weights giving each letter a different probability.

1:26 is a vector of weights for each letter

That makes it a valid answer. It's worth editing in an explanation so people not familiar with R can understand how it works.

I was going to, and then I realized that the guy above me had done much the same thing in his code and given an in depth explainer.

It's good that you added an explanation - the order in which solutions appear on the page can vary as the votes come in so the ones "above" might not be above later.

Befunge, 40 bytes
Revisiting this 7 years later, I realized I I could just add the whole alphabet in one string and pop off a random amount of letters before printing. Suddenly it beats Python!
"ZYXWVUTSRQPONMLKJIHGFEDCBA"> #$?:#@ #,_

Probabilities are the same as before; Starting from A, there is a 1/4 chance of printing the top of the stack, 2/4 to try again, and 1/4 to pop off one letter and repeat. If it somehow manages to move past Z it just starts over again with A. Trying a few times, the highest I got was an E.
Try it online!
Befunge, 168 164 bytes
More compact than the first one, with a little different probabilities: The first ? have a 1/4 chance of printing an A on "first try", 2/4 chance to come back to the same ?, and 1/4 to move to the next. The rest of the ?s each have 1/4 chance of printing the letter underneath them, 1/4 to try again, 1/4 moving to the next letter, 1/4 moving to the previous. Again, the probability of printing an A is a lot higher than printing a Z.
??????????????????????????>
""""""""""""""""""""""""""
ABCDEFGHIJKLMNOPQRSTUVWXYZ
""""""""""""""""""""""""""
>>>>>>>>>>>>>>>>>>>>>>>>>>,@
##########################

Befunge, 186 bytes
Obviously not gonna win with this, but I think it's an interesting answer nonetheless :)
v and > steers the cursor respectively downwards and to the right.
The ? operator sends the cursor off in one of four directions randomly. The first ? is "blocked" by v and > in two directions, so it only has two way to go: Either to print the A, or down to the next ?. So from the first ? alone there is a 50% chance of printing an A.
The next ? has a 1/3 chance of printing a B, 1/3 of going back up, and 1/3 of going further down. Etc etc.
It should be quite obvious that the higher letters have a much larger chance of being printed than the lower ones, but I'm not exactly sure what each letter's chances are.
Some help with the exact math would be appreciated :)
At least there's a 1/2 * 1/3^25 chance that the cursor moves all the way down to the Z on the first try, but I'm uncertain how the chances of the cursor moving up and down affects each letter.
,@ prints and quits.
 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">,@

+1 because you included the alphabet in a plywood sandwich.

PowerShell v2+, 33 31 bytes
[char](65..90|%{,$_*$_}|Random)

Takes a range from 65 to 90 (i.e., ASCII A to Z), pipes it through a loop. Each iteration, we use the comma-operator to create an array of that element times that number. For example, this will make 65 65s, 66 66s, 67 67s, etc. That big array is piped to Get-Random which will (uniformly PRNG) select one element. Since there are different quantities of each element, each character has a slightly distinct percentage chance of being picked. We then encapsulate that in parens and cast it as a char. That's left on the pipeline and output is implicit.
(Thanks to @LeakyNun for golfing a few bytes even before it was posted. :D)

The probabilities
(slight rounding so I could demonstrate the P option of the -format operator)
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 %

I started without looking at any of the answers; tried to build on gal output ([char[]]"uz$(gal|out-string)"-cmatch'[a-z]'|random) got to 50 characters, then 48, switched to numbers and got 42, then 31 and stopped there; looked on the leaderboard to see where that would put me. Right here. Character for character identical. Welp, I probably can't beat that.

CJam, 21 17 12 bytes
Thanks to Martin Ender for saving me 5 bytes!
New version
'\,:,s_el-mR

This forms an array of strings following the pattern A, AB, ABC, and so on. It flattens it and chooses a random character. Since this string contains 26 A's, 25 B's, 24 C's, and so on, each letter has a distinct probability of being chosen.
Try it online!
Explanation
'\,          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

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

Gets distinct probabilities by making a string in which each letter appears a number of times equal to its position in the alphabet.
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

C, 35 bytes
This program assumes RAND_MAX is (2^32 / 2) - 1 as it is on gcc by default. Compile with the -lm flag to link the sqrt function. The output is written to stdout as capital letters without trailing newlines.
f(){putchar(sqrt(rand())/1783+65);}

Optionally, if RAND_MAX is (2^16 / 2) - 1, a shorter 32 byte version can be used:
f(){putchar(sqrt(rand())/7+65);}

Just for fun, I also made a version that does not use the sqrt function or require the math library included (this one must have RAND_MAX as (2^32 / 2) - 1), but it ended up being longer even though I thought it was pretty cool:
f(){float r=rand()/64+1;putchar((*(int*)&r>>23)-62);}

Explanation
[First Program]
For the first two using sqrt, the function simply maps the range [0, RAND_MAX) to [0, 25] through division, and then adds 65 (ASCII A) to the value to shift it into the ASCII alphabet before outputting it.
[Second Program]
The second program is a bit more complex as it does a similar strategy, but without the sqrt operator. Since a floating point's exponent bits are automatically calculated upon assigning an integer, they can effectively be used as a crude way to get the base 2 logarithm of a number.
Since we only want the range up to RAND_MAX to reach an encoded exponent value of 25, the calculation (2^32 / 2 - 1) / (2 ^ 25) gives us just about 64, which is used during the division of rand to map it to this new range. I also added 1 to the value as 0's floating point representation is rather odd and would break this algorithm.
Next, the float is type-punned to an integer to allow for bitshifting and other such operations. Since in IEEE 754 floating point numbers the exponent bits are bits 30-23, the number is then shifted right 23 bits, cutting off the mantissa and allowing the raw exponent value to be read as an integer. Do note that the sign bit is also beyond the exponent bits, but since there are never any negatives it does not have to be masked out.
Rather than adding 65 to this result like we did before however, floating point exponents are represented as an unsigned 8 bit integer from 0 to 255, where the exponent value of 0 is 127 (Simply subtract 127 to get the actual "signed" exponent value). Since 127 - 65 is 62, we instead simply subtract 62 to both shift it out of this floating point exponent range and into the ASCII alphabet range all in one operation.
Distribution
I'm not math expert so I cannot say for sure the exact formula for these distributions, but I can (and did) test every value on the range [0, RAND_MAX) to show that the distance between where one letter's range ends and the other begins are never the same. (Note these tests assume the (2^32 / 2) - 1) random maximum)
[First Program]
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

[Second Program]
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

Wouldn't it be shorter to just return the ordinal than to print it? Since char is an integral type in C, that should be acceptable.

@Mego Oh well yeah if you can do that, I'm just new to golfing so I'm not too familiar with what is considered acceptable output.

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

Multiplies the character by its ascii value, then picks one character at random from the resulting string.
Here are the probabilities for each letter being selected, in percentages:
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

Try it:
https://repl.it/Cm0x

Labyrinth, 19 bytes
__v6%_65+.@
" )
"^2

Try it online!
This is a loop which, at each iteration, either a) increments a counter which starts at zero or b) terminates, both with probability 50%. At the end of the loop, the counter is taken modulo 26 and added to 65 to give a letter between A and Z.
This gives a probability for A just a bit over 50%, B just a bit over 25% and so on up to Z just a bit over 1/226. In theory, there is the possibility of this running forever, but this event has probability zero as required by the challenge (in practice that's probably not possible anyway because the PRNG will return both possible results at some point over its period).

Jelly, 5 bytes
ØAxJX

(Equal score, but a different method, to an existing Jelly solution by Dennis.)
The probability of yielding each letter is it's 1-based index in the alphabet divided by 351 - the 26th triangular number:

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

Since 1+2+...+26 = 351, P(letter) = 1.
Implementation:
Ø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

Test it on TryItOnline or get the distribution of 100K runs (code credit to Dennis)

Where'd you learn to be so good at Jelly? I find it hard to believe that Jelly would be common knowledge outside of PPCG.

@Syxer I just looked at the wiki and bashed away - still don't get all of it :)

Well then. Welcome to PPCG, have an up vote.

q, 38 bytes
Not particularly short but...
.Q.A(reverse 0.9 xexp til 26)binr 1?1f

The discrete cumulative distribution function is the sequence
0.9 ^ 26, 0.9 ^ 25, ..., 0.9 ^ 0
And we merely sample from the distribution.

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

Builds a string of all letters, repeated the number of times through the loop we are, and then picks a letter from that string at random.  Letters later in the alphabet have a higher probability as a result
Thanks to insertusernamehere for shaving off bytes
outcome probabililities (ordered by %)

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%

changed to actually adhere to the rules.  My mistake

@insertusernamehere I get undefined variable notices when I run that and no letter output

Oh I'm sorry. I think I got carried away and removed$x=0 which is obviously necessary. Here's a 84 bytes version: for($i=65,$x=0;$i<91;$a.=str_repeat(chr($i++),$x))$x++;echo substr($a,rand(0,$x),1); Did you ever manage to get a value greater then G when running your code? Anyway, you can always ignore notices when golfing.

I did, but it takes a while to crop up.  I ran it through about 100k iterations to check

The strlen of $a is 351, but you are only picking a random character out of the first $x (26) characters. You can fix it and keep your probabilities with a change of the final $x to 350 for +1 byte. Here is a 77 byte version that fixes the issue but also brings the probabilities much closer together: for($i=65;$i<91;$a.=str_repeat(chr($i),$i++));echo substr($a,rand(0,2014),1);

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

Achieves non-uniform distribution by squaring the random value. Math.random() returns a float of the range [0,1) so the result of squaring this tends towards 0 (or a).
Test

var solution =

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

var frequency = Array(26).fill(0);
for (var i = 0, tests = 1000000; i < tests; i++)
  frequency[solution().charCodeAt(0) - 97]++;
result.textContent = frequency
  .map((n, i) => [ String.fromCharCode(97 + i), n ])
  .sort((a, b) => b[1] - a[1])
  .map((x) => `${x[0]}: ${(x[1] / tests * 100).toFixed(2)}%`)
  .join('\n');

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

Oracle SQL 11.2, 212 bytes
Using character position in the alphabet as probability
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;

Un-golfed
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

TI-Basic, 39 bytes
sub("ABCDEFGHIJKLMNOPQRSTUVWXYZ",int(26^rand),1

rand generates a uniform value in (0,1]. This gives 26^rand a different probability to equal the integers from 1 to 26.
Older version, 45 bytes
sub("ABCDEFGHIJKLMNOPQRSTUVWXYZAAA",1+int(4abs(invNorm(rand))),1

Limited precision of the TI-Basic integers limits normal distributions to generating numbers within µ±7.02σ (see randNorm(). So we get the absolute value of a random number with µ 0 and σ 1, multiplying by four to increase the practical range mentioned before to µ±28.08σ. Then, we floor the value and add 1, since sub( is 1-indexed, giving us a range from 1-29 with different probabilities of each.

@trichoplax That was my mistake, I had 30 left over from the old version that was [0,29]. I fixed it now.

The interval (0,1] is supposed to be [0,1).

@kamoroso94 Have you checked? "Note: Due to specifics of the random number generating algorithm, the smallest number possible to generate is slightly greater than 0. The largest number possible is actually 1" - quoted from http://tibasicdev.wikidot.com/rand

Julia, 24 bytes
!c='a':c|>rand;c()=!!'z'

Try it online!
How it works
The function c() simply calls ! twice, with initial argument z. In turn !c creates a character range from a to its argument c and pseudo-randomly selects a character from this range. The distribution of probabilities is as follows.
Let x1, …, x26 denote the letters of the alphabet in their natural order. Select a letter Y among these, uniformly at random, then select a letter X from L1, … Y, also uniformly at random.
Fix n and k in 1, …, 26.
If n ≤ k, then p(X = xn | Y = xk) = 1/k. On the other hand, if n > k, then p(X = xn | Y = xk) = 0.
Therefore, p(X = xn) = Σ p(Y = xk) * p(X = xn | Y = xk) = 1/26 · (1/n + ⋯ + 1/26), giving the following probability distribution.
p(X = a) = 103187226801/696049754400 ≈ 0.148247
p(X = b) =  76416082401/696049754400 ≈ 0.109785
p(X = c) =  63030510201/696049754400 ≈ 0.090555
p(X = d) =  54106795401/696049754400 ≈ 0.077734
p(X = e) =  47414009301/696049754400 ≈ 0.068119
p(X = f) =  42059780421/696049754400 ≈ 0.060426
p(X = g) =  37597923021/696049754400 ≈ 0.054016
p(X = h) =  33773473821/696049754400 ≈ 0.048522
p(X = i) =  30427080771/696049754400 ≈ 0.043714
p(X = j) =  27452509171/696049754400 ≈ 0.039440
p(X = k) =  24775394731/696049754400 ≈ 0.035594
p(X = l) =  22341654331/696049754400 ≈ 0.032098
p(X = m) =  20110725631/696049754400 ≈ 0.028893
p(X = n) =  18051406831/696049754400 ≈ 0.025934
p(X = o) =  16139182231/696049754400 ≈ 0.023187
p(X = p) =  14354439271/696049754400 ≈ 0.020623
p(X = q) =  12681242746/696049754400 ≈ 0.018219
p(X = r) =  11106469546/696049754400 ≈ 0.015956
p(X = s) =   9619183746/696049754400 ≈ 0.013820
p(X = t) =   8210176146/696049754400 ≈ 0.011795
p(X = u) =   6871618926/696049754400 ≈ 0.009872
p(X = v) =   5596802526/696049754400 ≈ 0.008041
p(X = w) =   4379932326/696049754400 ≈ 0.006293
p(X = x) =   3215969526/696049754400 ≈ 0.004620
p(X = y) =   2100505176/696049754400 ≈ 0.003018
p(X = z) =   1029659400/696049754400 ≈ 0.001479

J, 20 18 bytes

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

Online interpreter
Uppercase.
Each letter's probability is its 1-based index in the alphabet.

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

it works by creating this string:
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

aka 65 times A, 66 times B, 67 times C...
and then it chooses a random character in it

Why'd you start at 65?

@gcampbell 65 is A in ascii.  you can start from 1, but then the inner loop becomes {65..$[#i]} which is 1 char longer

CJam, 11 bytes
4.mrmqC*'A+

or
676.mrmq'A+

Try it online!
This solution is similar to Luis's idea and creates a non-uniform distribution by taking the square root of the random variable.

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

Works by picking the larger or smaller (I forget which) of two random variables.

Matlab, 22
Will often return early letters, but can theoretically touch them all!
Takes one devided by a random number, limits this to 26 and turns it in to a character.
['' 96+min(1/rand,26)]

Not very short of course, but perhaps the concept can inspire other answers.

Does rand return a value in [0, 1)? That is, including zero but not including one. If this occasionally results in 1/0, will min(1/0,26) still return 26, or an error?

As far as I know rand returns a value in (0,1), so there shouldn't be a problem

@trichoplax Even though you won't see rand return 0 in practice, min(1/0,26) actually returns 26.

In that case, nice solution :)

C#, 68 66 bytes
Thanks to Leaky Nun for fixing the chance distribution.
var r=new Random();char f(char c='A')=>c<'Z'&r.Next(3)>0?f(++c):c;

Surprisingly short for a C# answer.
It defines a function f that returns a random character between the given one and Z. It has a 1/3 chance of returning the current character, otherwise it recurses on the next. If the current character is Z, it always returns. Default parameter is A, so calling it without any argument satisfies the challenge.
The resulting chances follow 2^(n-1) / 3^n:
A: 1/3
B: 2/9
C: 4/27
D: 8/81
...
Y: 16777216/847288609443
Z: 67108864/2541865828329

Y and Z have the same probability.

You can use 3 instead of 2 to fix this problem.

Fixed the chances, thanks @LeakyNun

CJam, 10 bytes
CJam approach #3...
26mr)mr'A+

Try it online!
This creates a uniformly random number x between 1 and 26 and then uses that to create a uniformly random number between 0 and x-1 which is added to A. This biases results towards smaller characters.

Mathematica, 34 bytes
RandomChoice[Range@26->Alphabet[]]

RandomChoice[wlist -> elist] gives a random choice of elist weighted by wlist.

Damn, beat me to it!

Ruby, 42 bytes
$><<(?A..?Z).flat_map{|c|[c]*c.ord}.sample

Quite straightforward: Generate 65 A's; 66 B's; ...  90 Z's, and randomly pick one of the letters generated.

x86_64 machine language for Linux, 15 19 17 16 bytes
L1:
48 0f c7 f0             rdrand %rax
f3 48 0f b8 c0          popcnt %rax,%rax
3c 1a                   cmp    $0x1a,%al
7d f3                   jge    L1
04 41                   add    $0x41,%al
c3                      retq

This requires support for the POPCNT and RDRAND instructions.
A uniform distributed random number is generated, the number of 1's in that number is counted, if that number is less than 26, a letter is returned. One will need to let the code run a long time before one sees a letter A.
To test, try something like
#include<stdio.h>
#define TEST "\x48\xf\xc7\xf0\xf3\x48\xf\xb8\xc0\x3c\x1a\x7d\xf3\4\x41\xc3"
int main(){
  int hist[26]={0};
  for(int i=0;i<10000000;i++){
    hist[ ((int(*)())TEST)() - 'A' ]++;
  }
  for(int i=0;i<26;i++){
    printf("%c %d\n", 'A'+i, hist[i] );
  }
}

Sample output
A 0
B 0
C 0
D 0
E 0
F 0
G 0
H 0
I 0
J 0
K 0
L 8
M 32
N 137
O 511
P 1639
Q 5188
R 14475
S 37539
T 91670
U 205638
V 431381
W 842259
X 1536776
Y 2626524
Z 4206223

The analytical expression for the probability of each letter can be derived from the binomial distribution. The letter A is assigned index k=0, B is assigned k=1 and so on.
        /  \
       | 64 |
       | k  |
        \  /
p(k)=------------
      25
      --- /  \
      \  | 64 |
      /  | i  |
      --- \  /
      i=0

 p(A)~1.0483e-18
 p(B)~6.7093e-17
 p(C)~2.1134e-15
 p(D)~4.3678e-14
 p(E)~6.6608e-13
 p(F)~7.9930e-12
 p(G)~7.8598e-11
 p(H)~6.5124e-10
 p(I)~4.6401e-09
 p(J)~2.8872e-08
 p(K)~1.5879e-07
 p(L)~7.7953e-07
 p(M)~3.4429e-06
 p(N)~1.3772e-05
 p(O)~5.0169e-05
 p(P)~1.6723e-04
 p(Q)~5.1214e-04
 p(R)~1.4460e-03
 p(S)~3.7758e-03
 p(T)~9.1413e-03
 p(U)~2.0568e-02
 p(V)~4.3095e-02
 p(W)~8.4231e-02
 p(X)~1.5381e-01
 p(Y)~2.6276e-01
 p(Z)~4.2042e-01

Nice recovery :)

LaTeX, 122 115 bytes
-7 bytes by replacing pgfmathparse{Hex(...)} with pgfmathHex{...}.
Or, if I'm allowed to skip the document class definition & setup, and just count the package import and functional code: 65 bytes.
pgfmathHex parses the expression and its (hexadecimal) result is then fed into \char which turns the code point into a unicode character. The expression itself is identical to many other answers here.
\documentclass{book}\usepackage{tikz}\begin{document}\pgfmathHex{65+sqrt(rnd)*26}\char"\pgfmathresult\char"\pgfmathresult\end{document}

Ungolfed (with cherry-picked for loop for page-filling output):
\documentclass{book}
\usepackage{tikz}
\begin{document}
\noindent
\foreach \n in {0,...,1513}
{
\pgfmathHex{65+sqrt(rnd)*26}\char"\pgfmathresult
}
\end{document}

Output (w/ free page number :) ):

Matlab, 24 18 bytes
char(floor(26*rand^2+65))
it looks like using floor(x) isn't necessary as char also takes non-integer inputs
char(25*rand^2+65)

not using ['' x] instead of char(x) so I won't get warning: implicit conversion from numeric to char for "purer" output.
rand yields a uniformly distributed random number in the interval (0,1) but rand^2 isn't uniformy distributed anymore, the probability density function follows ,  see here.
with (b-a)*rand+a one can shift the interval of the distribution from (0,1) to (a,b), this also works with rand^2.
because i use floor i need to stretch the interval to (65,91) so i don't lose "Z"
It might no be the shortest answer but i like the approach with using a uniform random distribution to get a non-uniform random distribution.
Below is the count for each generated numbers after 20000 iterations (using my first version of my answer).

As long as it gives correct output, I don't see a reason to avoid warnings. Go ahead and save the byte...

But the warning gets also printed as output, does that still count as it produces more output that the desired character?

Ah I see. If it's printed in conjunction with the output then that's a problem. I'd suggest checking if there's a command line switch that can suppress the warning at the cost of a byte but to save just one byte it's not worth it...

Consensus on meta seems to be that warnings to STDERR are fine but warnings to STDOUT are not . I'm not sure which Matlab uses, but mentioning in case it helps.

I'm not sure too, but thanks for the hint.
Although running the code in Matlab which had warnings turned off with warning('off','all') beforehand suppresses the warning - but i have no clue if this complies with the rules?

MATL, 12 bytes
1Y2toY"tnYr)

Try it online!
Explanation
1Y2          % Pushes the alphabet A...Z
   to        % Make a numeric copy [65 ... 90]
     Y"      % Run length decoding: 65 A's, 66 B's, etc. Let's call this [S]
        nYr  % Random number between 1 and length of [S], let's call this [i]
       t   ) % Index into a copy of [S] at the [i]'th position. Implicit display.

The selection from [S] is according to a uniform distribution, but since each letter in the alphabet occurs a distinct number of times in [S], the resulting distribution is also distinct for each letter in the alphabet.

SmileBASIC, 26 22 bytes
I think it's unfair that most of these are biased towards earlier letters.
Here's one that prints Z the most:
?CHR$(90-RND(RND(27)))

05AB1E, 4 bytes
AƶJΩ

Try it online! Beats all other answers.
AƶJΩ  # full program
   Ω  # random character from...
  J   # joined...
A     # "abcdefghijklmnopqrstuvwxyz"...
 ƶ    # with each character repeated 1-indexed index of character in string times
      # implicit output

AƶJ generates the string 'abbcccddddeeeeeffffffggggggghhhhhhhhiiiiiiiiijjjjjjjjjjkkkkkkkkkkkllllllllllllmmmmmmmmmmmmmnnnnnnnnnnnnnnoooooooooooooooppppppppppppppppqqqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrrrrsssssssssssssssssssttttttttttttttttttttuuuuuuuuuuuuuuuuuuuuuvvvvvvvvvvvvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzzz', so the chances are as follows:
a: 0.285%
b: 0.57%
c: 0.855%
d: 1.14%
e: 1.425%
f: 1.709%
g: 1.994%
h: 2.279%
i: 2.564%
j: 2.849%
k: 3.134%
l: 3.419%
m: 3.704%
n: 3.989%
o: 4.274%
p: 4.558%
q: 4.843%
r: 5.128%
s: 5.413%
t: 5.698%
u: 5.983%
v: 6.268%
w: 6.553%
x: 6.838%
y: 7.123%
z: 7.407%

Alternative, 4 bytes
AηJΩ

Try it online!
AηJΩ  # full program
   Ω  # random character from...
  J   # joined...
 η    # prefixes of...
A     # "abcdefghijklmnopqrstuvwxyz"
      # implicit output

AηJ generates the string 'aababcabcdabcdeabcdefabcdefgabcdefghabcdefghiabcdefghijabcdefghijkabcdefghijklabcdefghijklmabcdefghijklmnabcdefghijklmnoabcdefghijklmnopabcdefghijklmnopqabcdefghijklmnopqrabcdefghijklmnopqrsabcdefghijklmnopqrstabcdefghijklmnopqrstuabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvwabcdefghijklmnopqrstuvwxabcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyz', so the chances are as follows:
a: 7.407%
b: 7.123%
c: 6.838%
d: 6.553%
e: 6.268%
f: 5.983%
g: 5.698%
h: 5.413%
i: 5.128%
j: 4.843%
k: 4.558%
l: 4.274%
m: 3.989%
n: 3.704%
o: 3.419%
p: 3.134%
q: 2.849%
r: 2.564%
s: 2.279%
t: 1.994%
u: 1.709%
v: 1.425%
w: 1.14%
x: 0.855%
y: 0.57%
z: 0.285%

Zsh, 26 bytes
eval shuf -en1 {{a..z}..z}

Try it online! Includes a basic frequency analysis.
Explanation:

{a..z} - construct the string a b ... z
{{a..z}..z} - construct the string {a..z} {b..z} ... {z..z}
evaluate that string - executes shuf -en1 a b ... z b c ... z c d ... z ... y z z
shuf -en1 - picks one of those letters at random. In the pool, z is repeated 26 times, y 25 times, etc., which creates the distinct probabilities.

Vyxal, 5 bytes
ka¦∑℅

Try it Online!
same idea as the Pyth answer.

new codepage

@Lyxal looks much better

That's exactly why I decided to change the code page

Try it Online! for 4 bytes

Phooey, 26 bytes
~?675@(&>@+1@<--@@^)>+63$c

Try it online!
The demo contains a simple infinite loop which resets the tape (this program expects a clean tape and doesn't clean up lul)
Similar to a lot of other answers, this generates a number from \$0-675\$ and uses roughly \$\lfloor \sqrt{n}\rfloor\$ to select the letter with varying probability.
Unfortunately, AFAICT, there is no way of doing a square root automatically since the pow operator uses integers. Maybe there is a fixed point method, but idk yet.
However, the naïve subtraction method works and is probably shorter than any other solution. It's only going to be running a few iterations, so the inefficiency isn't that bad.
int64_t isqrt(int64_t n)
{
    int64_t d = 0;
    while (n >= 0) {
        n -= d;
        d += 1;
        n -= d;
    }
    return d - 1;
}

My implementation actually has an off-by-one problem with my loop condition check. I use \$x^x\$ (@^) instead of \$2^x\$ (@&2^) which is the "proper" (at least, in Phooey) way to check for negatives, and when \$x = -1\$, it will report a false negative (or is it a false positive? ), as \${-1}^{-1} = {-1}, {-1} \ne 0\$.
HOWEVER, that doesn't affect the output's randomness. It just means that Z will appear once instead of A and we need \$d - 2\$ instead of \$d - 1\$.
With all values from \$0-675\$ tested, this is the frequency:
A 3   B 5
C 7   D 9
E 11  F 13
G 15  H 17
I 19  J 21
K 23  L 25
M 27  N 29
O 31  P 33
Q 35  R 37
S 39  T 41
U 43  V 45
W 47  X 49
Y 51  Z 1

How it works:
~?675@(&>@+1@<--@@^)>+63$c
~?675                       # Generate a random integer between 0 and 675 inclusive
     @                      # Push the initial n to the stack
                            # Begin our naïve semi-sqrt loop
      (            )        # while n >= 0
       &                    #    Pop n from the stack
        >                   #    Move left to d
         @                  #    Push d
          +1                #    Increment d
            @               #    Push d + 1
             <              #    Move back to n
              --            #    Subtract d and d + 1, popping them
                            #    Use a modified method I found in my Brexit post to check for < 0
                @           #    Save a copy of n
                 @^         #    Calculate n^n using double<->int64 conversion
                            #    The current cell will contain zero if n < -1, or nonzero otherwise.
                            #    Use that as our loop condition.
                    >       # Move to d
                     +63    # d += 'A' - 2
                        $c  # print as char

Clojure, 61 bytes
#(char(- 90(count(take-while(fn[a](<(rand)0.5))(range 26)))))

Takes each successive element from the range of 26 elements with probability 1/2. So the chance that one element is taken is 1/2, 2 elements - 1/4 and so on. After that subtract from 90 number of elements taken and turn it into char.
p(Z) = 1/2, p(Y) = 1/4, p(X) = 1/8 ... p(A) = 1/2^(26)
See it online: https://ideone.com/Cg15FY

This appears to give the same probability for A and B. Imagine it for an alphabet of only 3 letters ABC: p(C) = 1/2, p(B) = 1/4, p(A) = 1 - 1/2 - 1/4 = 1/4.

Unless A is also chosen with a probability of 1/2 when it is reached, with the possibility of wrapping back round to Z? If it always terminates when it reaches A then p(A) = p(B) = 1/2^(25).

Julia, 33 bytes
f()=['A':'Z'][ceil(26*√rand())]

Applies the square root to RNG.
Graph showing distribution:

Generated with:
using Gadfly
plot(x=ceil(26*√rand(10000)),Geom.histogram)

perl, 21 bytes
say+(A..Z)[rand$$%27]

Needs -M5.010 or -E to run :
perl -E 'say+(A..Z)[rand$$%27]'

How it works : (A..Z) is an array. $$ is process ID, which introduces some randomness. $$%27 is a number between 0 and 26 (inclusive, and roughly evenly spread). Calling rand on that produces a number between 0 and 26 (inclusive at 0, exclusive at 26), but biased towards smaller numbers. We then use that number for an array lookup, which we print.
Opportunities for improvement :
$$ is random, but not cleanly random. We know that the chance of getting particular numbers differs, but not by much, and not in ways that are easy to predict cleanly. Therefore, the possibility of getting different each letter is probably not identical, but it's very close. If (and only if) we accept that probability{ $$%26 == x } is different for all x, then we could replace "rand$$%27" with "$$%26".
Alternately, we could replace "rand$$%27" with (for example) "26*sin$$", and save one character. This gives a much less regular spread than simply "$$%26":

 perl -E 'for(1..32768){say+(A..Z)[26*sin$_]}' | sort | uniq -c
    832 A
   3269 B
   1648 C
   1360 D
   1183 E
   1133 F
   1043 G
   1071 H
    959 I
    978 J
    985 K
    939 L
    926 M
    950 N
    924 O
    939 P
    985 Q
    977 R
    959 S
   1072 T
   1043 U
   1135 V
   1182 W
   1360 X
   1647 Y
   3269 Z

But if you check, you'll see that it's not perfect. There are three pairs of numbers that have the same probability as each other: K&Q, I&S, L&P.
(If you use actual PIDs, then depending on what processes are actually running, and depending on the highest allowable pid on your machine, you might get more clashes, or less.)
"15*sin$$" works better, only 2 clashes - but that is still 2 clashes. (Any number between 13 and 26 will work, in the sense of producing all 26 letters, because sin(x) spans -1 to +1 and perl treats negative number array look-ups as starting from the array end).
There might be some way of getting all 26 numbers, with different probabilities, using less (or no more) than the 8 characters that "rand$$%27" needs. But if so, it isn't coming to me.

Dyalog APL, 14 bytes
See this meta post for information about the code page.
(?351)⊃⎕A/⍨⍳26

Gives instant results. Works by selecting an evenly distributed random character among "ABBCCCDDDD..."
(?351) RandInt(1,351)
⊃picks among
⎕A "ABC...Z"
/⍨ element-by-element replicated
⍳26 {1, 2, 3, ..., 26} times
TryAPL online!

@MartinEnder. Ouch, that may affect a few submissions.

Well I think some of the leaderboard implementations are a bit smarter than the one I used here.

ForceLang, 64 bytes
Noncompeting, uses language features (the string.char method) that postdate the question.
set s math.sqrt 676.mult random.rand()
io.write string.char 65+s

Override header: Valid but noncompeting (ignore this - it's just to let the leaderboard snippet know)

Actually, 7 bytes
ú#;╚♀MJ

Try it online!
This answer uses the same approach as Dennis's Jelly answer.
Explanation:
ú#;╚♀MJ
ú#       lowercase English alphabet, as a list (this is to dodge a bug with the shuffle command)
  ;╚     duplicate, shuffle
    ♀M   pairwise maximum
      J  random element

Clojure, 62 bytes
(loop[i 65](if(or(> i 89)(neg?(rand)))(char i)(recur(inc i))))

This is somewhat stupid shortcut. The probability of exact zero double - the only (rand) to not break on condition (pos? x) - is around 1/(2^62) [source].
So chance for letter char(65+N) is around (1/(2^62))^N, slightly higher for Z (because it is last).
With (rand-int 2) - 6 more bytes - it becomes testable.

Perl 6, 30 bytes
{('a'..'z'Zxx 1..*).flat.pick}

Explanation:
# bare block lambda
{
  (

    'a' .. 'z' # the alphabet
    Z[xx]      # zipped ｢Z｣ using the list repeat operator ｢xx｣
    1 .. *     # with 1 to 26

    # ((a)(b b)(c c c)(d d d d)(e e e e e)...

  )
  .flat # flatten it from a list of lists into a single list
  .pick # pick an element from the list
}

Lua, 100 99 bytes
s="A"math.randomseed(os.time())for i=66,90 do
s=.6<math.random()and string.char(i)or s end
print(s)

Not really competitive, but still an interesting algorithm I think.

Due to there being a probability of 0.5 each time through the loop, it looks like the end of the loop leaves the same probability for Z as for Y (since there can be no halving of the probability when only Z is left). You could get around this by using a figure other than 0.5, which would make the solution valid without adding any bytes.

@trichoplax I see what you mean. Changed it, thanks!

Pip, 8 bytes
(zr*r*h)

z is a built-in for the lowercase alphabet, h for 100. r is a special variable: each time it is evaluated, it generates a random number with uniform distribution, 0 <= r < 1. Thus, r*r*h squares the uniform distribution and scales it a hundredfold (saving a character over using 26). The result is used to index into z, auto-truncated and with index wrapping.
Try it here (frequency chart of 100,000 runs, takes about 30 seconds).

It wasn't immediately obvious to me that folding the unevenly distributed range of 100 values into a range of 26 values would maintain the property of having all probabilities distinct (especially as the frequency chart has some letters appearing similar numbers of times). I checked and can confirm that the probabilities (assuming a perfect uniform distribution as a starting point) are all distinct:

0.122257379845413, 0.063400059354823, 0.0534956778948075, 0.0482511384937917, 0.04481748680079, 0.0423168133306285, 0.0403735674712969, 0.0387960044737913, 0.0374744304593056, 0.0363408541731965, 0.0353505332076944, 0.0344726212707875, 0.0336850437718526, 0.0329715122041705, 0.0323196958133572, 0.0317200547970168, 0.0311650693170861, 0.0306487146656851, 0.0301660946708953, 0.0297131797962578, 0.0292866162765532, 0.028883584540095, 0.023514130401554, 0.0231759623356073, 0.0228547631421794, 0.0225490114913639

IA-32 machine code, 12 bytes
Hexdump:
0F C7 F0 F6 E4 88 E0 D4 1A 04 61 C3

Source code:
rdrand eax
mul ah
mov al, ah
aam 26
add al, 'a'
ret

Or, as a C expression (assuming r is a uniformly generated random number of type uint32_t):
(r & 0xff) * ((r >> 8) & 0xff) / 0x100 % 26 + 'a'

Running this expression on values in the range 0...65535 gives the probabilities of the letters:
z 1968
y 2012
x 2068
w 2076
v 2134
u 2140
t 2194
s 2209
r 2233
q 2292
p 2335
o 2358
n 2410
m 2437
l 2475
k 2545
j 2571
i 2654
h 2696
g 2738
f 2818
e 2922
d 2955
c 3098
b 3241
a 3957

Javascript, 93 91 bytes
Yes there is a shorter one, but that does it differently. Also I spent half an hour on this so I'm not giving up.
q=>'abcdefghijklmnopqrstuvwxyz'.split``.map((i,k)=>i.repeat(k)).join``[Math.random()*351|0]

Explained:
q=> // define function, meaningless arg saves a byte
'abcdefghijklmnopqrstuvwxyz'.split`` // get each alphabet character in array
.map((i,k)=>i.repeat(k)) //replace each with it repeated index times
.join``[Math.random()*351|0] //turn to string and get random character.

Probability:
a - 1/351
b - 2/351
c - 3/351

Etcetera.
Note: according to this comment, I don't have to use a function declaration if it isn't recursive.

MathGolf, 6 bytes
▄mÅî*w

Try it online.
Explanation:
▄       # Push the lowercase alphabet
 m      # Map over each letter
  Å     # using the following two characters as inner code-block:
   î    #  Push the 1-based map-index
    *   #  Repeat the current character that many times
     w  # After the map: pop and push a random character from this string
        # (after which the entire stack joined together is output implicitly as result)

Same probability as most other answers:

a: \$\frac{1}{351}\$
b: \$\frac{2}{351}\$
...
y: \$\frac{25}{351}\$
z: \$\frac{26}{351}\$

I haven't done the exact math on this, but since indexing repeats for indices that are higher than the length of a string/array (e.g. "abcd"9§ gives "b"), you could do something like ▄v²§ (link). Basically, get a random 32 bit integer, square it to skew the probabilities, and index the alphabet using the skewed random integer.

@maxb Unless I'm doing something wrong myself, I'm pretty sure some of the letters will never be output. If we square and then modulo-26, range [0,25] will result in [0,1,4,9,16,25,10,23,12,3,22,17,14,13,14,17,22,3,12,23,10,25,16,9,4,1], but so will range [26,51], [52,77], etc. It's a repeating pattern apparently. Those integers will the only possible outputs, so some letters (i.e. 2=c) will never be output, and the letters that do output have in most cases overlapping probabilities.

You're right, I just tried it and noticed that the residues weren't distributed over all 26 possible values. I tried some different things (like the cube/factorial/fibonacci operators), but I haven't had any luck yet. Trying to analyze vv* now (one byte longer, but should avoid some of the issues above)

I found something that works... ▄v±√i§, saving exactly 0 characters.

Python 3, 58 bytes
from random import*;print(chr(randint(65,randint(65,91))))

it is like that perl answer.

57 bytes: r=__import__('random').randint;print(chr(r(65,r(65,91))))

post yourself? @Flp.Tkc

I just golfed the import statement, you did the main algorithm, so post it yourself :)

k4, 15 bytes
*1?a|-26?a:.Q.A

A port of @Dennis's Jelly answer.

JavaScript ES6, 42 Bytes, modified from user81655's solution:
_=>(0|10+26*Math.random()**2).toString(36)

Javascript, 49 bytes
f=()=>String.fromCharCode(65+Math.random()**2*26)

Thunno 2, 4 bytes
ẠƒJɼ

Attempt This Online!
This takes the prefixes of the lowercase alphabet, joins them, and takes a random character from this string. This means that the probabilities are as follows:

a: \$26/351\$
b: \$25/351\$
\$...\$
y: \$2/351\$
z: \$1/351\$

Ạ     # Push the lowercase alphabet      ->  "abcdefghijklmnopqrstuvwxyz"
 ƒ    # Get the prefixes of this string  ->  ["a","ab",...,"abcdefghijklmnopqrstuvwxyz"]
  J   # Join them into a single string   ->  "aababc...abcdefghijklmnopqrstuvwxyz"
   ɼ  # Take a random character from this string
      # Implicit output

Lua, 69 bytes
math.randomseed(os.time())print(('').char(math.random(727)^.5//1+64))

Try it online!


text:
Chess conversion
There's quite a lot of work that's been done in the world of chess.  For example, there is a standardized file format, .pgn, that describes a chess game, including the list of moves.  Additionally, there's another file format .fen, that describes a board position.  The challenge today is to convert a list of chess moves (in algebraic notation) to a board position.
Definitions

Position [a-h][1-8]:  Given by appending the row (file) and the column (rank).  Defines one of the 64 possible positions on the board.
Piece[KQRBNP]?:  Represents the King, Queen, Rook, Bishop, KNight, Pawn.  In algebraic notation, P is not used.  When used on a board, letters are uppercase if they are White, otherwise lowercase.
Move [KQRBN]?[a-h]?[1-8]?x?[a-h][1-8](=[KQRBN])?(+*?)?|O-O(-O): A piece followed by the position it is moving to.

If the piece is ambiguous, then the row, or the column, or both are given.
If the piece is capturing a piece, then x is placed between the piece and the position.
If the move is a castling, then O-O is given for king-side, otherwise O-O-O.
If a pawn is being promoted, the move is appended with = followed by the piece it is being promoted to.
If a move puts the king in check, it is appended with a +.
If a move puts the king in checkmate, its appended with #.
The color of the piece is determined by the turn number (White and black alternate turns, starting with black.)

Board(([1-8]|[KQRBNPkqrbnp])*\/){8}: Rows are given by listing the pieces in row order.  If there are empty squares, each run of empty square is given using the length of the run.  Rows are separated using /

A board's initial position is rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR, which represents:
rnbqkbnr
pppppppp

PPPPPPPP
RNBQKBNR

You need to take a list of Moves and return a Board.  You can assume that your input is valid.
Examples
                     -> rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR
e4                   -> rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR
e4,c5                -> rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR
e4,d5,exd5,e5        -> rnbqkbnr/ppp2ppp/8/3Pp3/8/8/PPPP1PPP/RNBQKBNR
e4,d5,exd5,e5,dxe6   -> rnbqkbnr/ppp2ppp/4P3/8/8/8/PPPP1PPP/RNBQKBNR
e4,d5,exd5,e5,dxe6,Bc5,Nf3,Nf6,d4,Nc6,dxc5,Ne5,h4,h5,Nh2,Neg4 -> r1bqk2r/ppp2pp1/4Pn2/2P4p/6nP/8/PPP2PPN/RNBQKB1R
e4,d5,exd5,e5,dxe6,Bc5,Nf3,Nf6,d4,Nc6,dxc5,Ne5,h4,h5,Nh2,Neg4,g3,Nxf2,Qd4,N6g4 -> r1bqk2r/ppp2pp1/4P3/2P4p/3Q2nP/6P1/PPP2n1N/RNB1KB1R
e4,d5,exd5,e5,dxe6,Bc5,Nf3,Nf6,d4,Nc6,dxc5,Ne5,h4,h5,Nh2,Neg4,g3,Nxf2,Qd4,N6g4,Bf4,O-O -> r1bq1rk1/ppp2pp1/4P3/2P4p/3Q1BnP/6P1/PPP2n1N/RN2KB1R
e4,d5,exd5,e5,dxe6,Bc5,Nf3,Nf6,d4,Nc6,dxc5,Ne5,h4,h5,Nh2,Neg4,g3,Nxf2,Qd4,N6g4,Bf4,O-O,Na3,Nxh1,O-O-O,Qg5,exf7+ -> r1b2rk1/ppp2Pp1/8/2P3qp/3Q1BnP/N5P1/PPP4N/2KR1B1n
e4,d5,exd5,e5,dxe6,Bc5,Nf3,Nf6,d4,Nc6,dxc5,Ne5,h4,h5,Nh2,Neg4,g3,Nxf2,Qd4,N6g4,Bf4,O-O,Na3,Nxh1,O-O-O,Qg5,exf7+,Kh7,Bxg5,Rd8,f8=Q -> r1br1Q2/ppp3pk/8/2P3Bp/3Q2nP/N5P1/PPP4N/2KR1B1n
e4,d5,exd5,e5,dxe6,Bc5,Nf3,Nf6,d4,Nc6,dxc5,Ne5,h4,h5,Nh2,Neg4,g3,Nxf2,Qd4,N6g4,Bf4,O-O,Na3,Nxh1,O-O-O,Qg5,exf7+,Kh7,Bxg5,Rd8,f8=Q,Ngf2,c6,Rd7,cxd7,b6,d8=Q,c6,Q4d6,Ba6,Qd8f6 -> r4Q2/p5pk/bppQ1Q2/6Bp/7P/N5P1/PPP2n1N/2KR1B1n
e4,d5,exd5,e5,dxe6,Bc5,Nf3,Nf6,d4,Nc6,dxc5,Ne5,h4,h5,Nh2,Neg4,g3,Nxf2,Qd4,N6g4,Bf4,O-O,Na3,Nxh1,O-O-O,Qg5,exf7+,Kh7,Bxg5,Rd8,f8=Q,Ngf2,c6,Rd7,cxd7,b6,d8=Q,c6,Q4d6,Ba6,Qd8f6,Rb8,Qdd8,b5,Qc5,b4,Qxb8,bxa3,Rd3,Nxd3+,Kd1,axb2,Bh3,b1=Q+,Kd2,Qxa2,Qh6+,gxh6,Qcd6,Qa1,Qbc7+,Kh8,Qdd8# -> 3Q3k/p1Q5/b1p4p/6Bp/7P/3n2PB/2PK3N/q6n

This is a code-golf, so make your answers as short as possible!

So no en passant :p?

@Adnan I believe that my test cases include an en passant.

Oh sorry, I didn't see that. I'm always used to notate en passant moves with e.p..

May we take the moves separated by spaces instead?

Of course.  Any list format is acceptable.

@NathanMerrill And what about the output format? Different spacers, different order(say from a1 to a8 to b..h)?

The order should stay the same. I'm OK if the separators are different

White and black alternate turns, starting with black??

I believe that white starts :)

Javascript (ES6), 1024 995 bytes
This is an early and still bulky attempt. I just stopped optimizing it when the 1K limit was reached.
It's probably not bullet-proof and only considers promotions to a Queen. But it does pass the test case.
Edit: 995 bytes - a few obvious optimizations
Source
F=i=>{B=[];b=0;X=[8,2,4,12,16,4,2,8,1];for(n=120;n--;B[n]=n<8?X[n]|32:n<24?33:n>111?X[n-112]
:n>95|0);Y=j=>(M[j]?M[j].charCodeAt(0)-97:8)|(M[++j]?(8-M[j])*16:128);G=_=>(F&8||!(F&7^f&7))
&&(F&128||!(F&112^f&112))&&B[f]==p;Z=d=>{for(k=f,u=1;(k+=d)!=T;)u&=!B[k]};Q=(j,...D)=>D.some
(d=>(j&2?!((f-T)%d)&&(Z(f<T?d:-d),u):T-f==d||(j&&f-T==d))&&(S=f));i.split(',').forEach(m=>{
if(m[0]=='O'){S=b?4:116;m[4]?(T=S-2,B[S-1]=B[S-4],B[S-4]=0):(T=S+2,B[S+1]=B[S+3],B[S+3]=0)}
else{M=m.match(/([B-R])?([a-h])?(\d)?x?([a-h])?(\d)?(=Q)?/);p=X["QKBNRP".indexOf(M[1]||'P')+
3]|b;F=Y(2);M[4]?T=Y(4):(T=F,F=136);for(f=120,S=0;f--;)G()&&(p&4&&Q(2,15,17),p&8&&Q(2,1,16),
p&2&&Q(1,14,18,31,33),p&16&&Q(1,1,15,16,17),p&1&&Q(0,b-16,2*b-32));for(f=120;p&1&&!S&&f--;)
G()&&Q(0,b-15,b-17);B[S]&1&&(S-T)%16&&!B[T]&&(B[T+16-b]=0)}B[T]=B[S];B[S]=0;M[6]&&(B[T]^=13)
;b^=32});for(r='',y=0;y<8;y++){for(x=z=0;x<8;x++)(b=B[y*16+x])?(p=".PN.B...R...Q...K"[b&31],
r+=(z||'')+(b&32?p.toLowerCase():p),z=0):z++;r+=(z||'')+(y<7?'/':'')}return r}

Full executable snippet

F=i=>{B=[];b=0;X=[8,2,4,12,16,4,2,8,1];for(n=120;n--;B[n]=n<8?X[n]|32:n<24?33:n>111?X[n-112]:n>95|0);Y=j=>(M[j]?M[j].charCodeAt(0)-97:8)|(M[++j]?(8-M[j])*16:128);G=_=>(F&8||!(F&7^f&7))&&(F&128||!(F&112^f&112))&&B[f]==p;Z=d=>{for(k=f,u=1;(k+=d)!=T;)u&=!B[k]};Q=(j,...D)=>D.some(d=>(j&2?!((f-T)%d)&&(Z(f<T?d:-d),u):T-f==d||(j&&f-T==d))&&(S=f));i.split(',').forEach(m=>{if(m[0]=='O'){S=b?4:116;m[4]?(T=S-2,B[S-1]=B[S-4],B[S-4]=0):(T=S+2,B[S+1]=B[S+3],B[S+3]=0)}else{M=m.match(/([B-R])?([a-h])?(\d)?x?([a-h])?(\d)?(=Q)?/);p=X["QKBNRP".indexOf(M[1]||'P')+3]|b;F=Y(2);M[4]?T=Y(4):(T=F,F=136);for(f=120,S=0;f--;)G()&&(p&4&&Q(2,15,17),p&8&&Q(2,1,16),p&2&&Q(1,14,18,31,33),p&16&&Q(1,1,15,16,17),p&1&&Q(0,b-16,2*b-32));for(f=120;p&1&&!S&&f--;)G()&&Q(0,b-15,b-17);B[S]&1&&(S-T)%16&&!B[T]&&(B[T+16-b]=0)}B[T]=B[S];B[S]=0;M[6]&&(B[T]^=13);b^=32});for(r='',y=0;y<8;y++){for(x=z=0;x<8;x++)(b=B[y*16+x])?(p=".PN.B...R...Q...K"[b&31],r+=(z||'')+(b&32?p.toLowerCase():p),z=0):z++;r+=(z||'')+(y<7?'/':'')}return r}

console.log(F(
  "e4,d5,exd5,e5,dxe6,Bc5,Nf3,Nf6,d4,Nc6,dxc5,Ne5,h4,h5,Nh2,Neg4,g3,Nxf2,Qd4,N6g4,Bf4," +
  "O-O,Na3,Nxh1,O-O-O,Qg5,exf7+,Kh7,Bxg5,Rd8,f8=Q,Ngf2,c6,Rd7,cxd7,b6,d8=Q,c6,Q4d6,Ba6," +
  "Qd8f6,Rb8,Qdd8,b5,Qc5,b4,Qxb8,bxa3,Rd3,Nxd3+,Kd1,axb2,Bh3,b1=Q+,Kd2,Qxa2,Qh6+,gxh6," +
  "Qcd6,Qa1,Qbc7+,Kh8,Qdd8#"
));

source: Stack Exchange

license: Creative Commons - Attribution Share-Alike - https://creativecommons.org/licenses/by-sa/3.0/

sort: votes