I would store probabilities for each name:
var names = new [] {"Adam", "Barbara", "Cecilia", "Daniel", "Emily", "Felix"};
var probabilities = new [] {0.15, 0.2, 0.1, 0.35, 0.15, 0.05};
Assuming
System.Random.NextDouble()[
^] returns a random variable x of uniform distribution on interval 0 <= x < 1. We can transform this to our custom distribution.
var thresholds = new [] {0.15, 0.35, 0.45, 0.8, 0.95, 1.0};
var randomValue = random.NextDouble();
var index = Array.BinarySearch(thresholds, randomValue);
if(index < 0)
{
index = ~index;
}
var name = names[index];
Array.BinarySearch[
^] returns the index of the item if found or bitwise complement of the index of next bigger item.