var используйте любую математическую библиотеку, чтобы сгенерировать случайное число от 0 до 26 в кубе - 1, затем присвойте буквы на основе значения этого случайного целого числа ...
в дальнейшем обратный слеш представляет целое числоделение, то есть отбрасывание любого дробного остатка
первый символ = ascii (65 + целочисленный модуль 26)
второй символ = ascii (65 + (целое число \ 26) модуль 26
третий символ = ascii (65 + ((целое число \ 26) \ 26) модуль 26
ааа, спасибо @Graphain Я понимаю, что вы хотите исключить любые шансы выбрать ту же комбинацию из трех символов снова ... ну, вот вам путь...
- Создать коллекцию (Список?), Содержащую 676 (26 * 26) 32-битных целых чисел, все они инициализированы в 2 ^ 26-1 (поэтому биты 0-25 все установлены = 1).Поместите 26 из этих целых чисел в каждый из 26 внутренних словарей, чтобы они превратились в словарь из 26 словарей, в каждом из которых есть 26 из этих целых чисел. Маркируйте внутренние словари AZ. Внутри каждого внутреннего массива маркируйте целые числа AZ.* Случайно выбрать один из 26 внешних массивов (это устанавливает первый символ).
- Из выбранного массива случайным образом выберите один из его внутренних массивов.Это устанавливает второй символ.
- Затем случайным образом выбирают число от 0 до n (где n - количество бит в целом числе, которые все еще установлены в 1) ... Какой бит в числе определяетпоследний символ.
- Установить этот бит на ноль
- Если все биты в целом числе были установлены в ноль, удалить целое число из массива
- Если этот внутренний массив теперь пуст,(все целые числа пропали) удалите его из внешнего массива.
- Повторяйте с шага 2, пока внешний массив не опустеет или вы не устанете ...
Вот пример кода (не тестировался)):
public class RandomAlphaTriplet
{
private static readonly Dictionary<char, Dictionary<char, int>> vals =
new Dictionary<char, Dictionary<char, int>>();
const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
private static readonly Random rnd = new Random(DateTime.Now.Millisecond);
private const int initVal = 0x3FFFFFF;
static RandomAlphaTriplet()
{
foreach (var c in chars)
vals.Add(c, chars.ToDictionary(
ic => ic, ic => initVal));
}
public static string FetchNext()
{
var c1 = chars[rnd.Next(vals.Count)];
var inrDict = vals[c1];
var c2 = chars[rnd.Next(inrDict.Count)];
var intVal = inrDict[c2];
var bitNo = rnd.Next(BitCount(intVal));
var bitPos = 0;
while (bitNo > 0)
{
if ((intVal & 0x0001) > 0) bitNo--;
bitPos++;
intVal <<= 1;
}
var c3 = chars[bitPos];
inrDict[c2] &= ~(1 << bitPos);
if (inrDict[c2] == 0) inrDict.Remove(c2);
if (vals[c1].Count == 0) vals.Remove(c1);
return string.Concat(c1, c2, c3);
}
private static int BitCount(int x)
{ return ((x == 0) ? 0 : ((x < 0) ? 1 : 0) + BitCount(x << 1)); }
}