The problem could lie in one of the other letter sets and the combination of characters is what is causing your issue. For instance I can cause the test case by @Harrison to fail by including a combining diacritical mark such as \u0301 to the string. So without seeing the other sets and the input test case you are using it is hard to say.
Ignoring all that the correct way to do this if you do have combining chars or surrogate pairs is to use StringInfo.GetTextElementEnumerator to iterate over the strings logical chars. Here is a badly performing example that would replace your current Random implementation.
public static class Extensions
{
private static Random rand = new Random(1);
public static string Random(this string str)
{
var chars = new List<string>();
var strElements = StringInfo.GetTextElementEnumerator(str);
while (strElements.MoveNext())
{
chars.Add(strElements.GetTextElement());
}
return chars[rand.Next(chars.Count)];
}
}
This will cover all cases for instance the letter "ś"
can be defined by its literal and has a length of 1 or with a combining char over s "s\u0301"
which has a length of 2. These both represent the same glyph when rendering.