Random

Randomizer: Gerar números aleatórios sem repetição, letras, palavras e mais – C#

Nos últimos tempos tenho visto algumas perguntas nos Fóruns do MSDN sobre como gerar um número aleatório sem repetição. Resolvi estudar o problema e então criei uma classe chamada Randomizer que permite gerar números aleatórios sem repetir, letras aleatórias, palavras aleatórias (leia-se: aglomerado de várias letras aleatórias), caracteres, e dígitos (leia-se: um número de 0 a 9).

Segue o código:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace HL
{
    /// <summary>
    /// Métodos avançados para randomização
    /// </summary>
    static class Randomizer
    {
        static Randomizer()
        {
            listRandom = new Random();
            nextRandom = new Random();
            nextRandomHistory = new ArrayList();
        }
        private static Random listRandom;
        private static Random nextRandom;
        private static ArrayList nextRandomHistory;
        /// <summary>
        /// Gera uma lista preencida com números organizados de forma aleatória
        /// </summary>
        /// <param name="min">O número de partida</param>
        /// <param name="count">Quantidade de números</param>
        /// <returns></returns>
        public static IList<int> Random(int min, int count)
        {
            IList<int> list = Enumerable.Range(min, count).OrderBy(r => listRandom.Next()).ToList();
            return list;
        }
        /// <summary>
        /// Gerar um número aleatório único
        /// </summary>
        /// <returns>Retorna um número aleatório único nesta instância do aplicativo</returns>
        public static int Next()
        {
            int value = nextRandom.Next();
            while (true)
            {
                if (!nextRandomHistory.Contains(value))
                {
                    nextRandomHistory.Add(value);
                    return value;
                }
                value = nextRandom.Next();
            }
        }
        /// <summary>
        /// Gerar uma letra aleatória
        /// </summary>
        /// <returns></returns>
        public static char RandomLetter()
        {
            return (char)((new int[] { nextRandom.Next(65, 90), nextRandom.Next(97, 122), nextRandom.Next(128, 166) })[nextRandom.Next(0, 3)]);
        }
        /// <summary>
        /// Gerar um número de 0 a 9 aleatóriamente
        /// </summary>
        /// <returns></returns>
        public static int RandomDigit()
        {
            return nextRandom.Next(0, 10);
        }
        /// <summary>
        /// Gerar um caractere aleatório
        /// </summary>
        /// <returns></returns>
        public static char RandomChar()
        {
            return (char)nextRandom.Next(1, 256);
        }
        /// <summary>
        /// Gerar uma palavra com letras aleatórias
        /// </summary>
        /// <param name="charCount">Quantidade de letras</param>
        /// <returns></returns>
        public static string RandomWord(int charCount)
        {
            StringBuilder str = new StringBuilder();
            char previous = (char)0;
            for (int i = 1; i <= charCount; i++)
            {
                char rnd = RandomLetter();
                while (true)
                {
                    if (rnd != previous) break;
                    rnd = RandomLetter();
                }
                str.Append(rnd);
                previous = rnd;
            }
            return str.ToString();
        }
    }
}

A função Next() gera um número aleatório único na instância do aplicativo, ou seja, se você fechar o aplicativo e abrir novamente pode ser que seja gerado um mesmo número gerado anteriormente na outra instância.