随机选取字符

26

我有一些字符:

chars = "$%#@!*abcdefghijklmnopqrstuvwxyz1234567890?;:ABCDEFGHIJKLMNOPQRSTUVWXYZ^&".ToCharArray();

现在我正在寻找一种方法,可以从中返回一个随机字符。我找到了一段可能有用的代码:
static Random random = new Random();
        public static char GetLetter()
        {
            // This method returns a random lowercase letter
            // ... Between 'a' and 'z' inclusize.
            int num = random.Next(0, 26); // Zero to 25
            char let = (char)('a' + num);
            return let;
        }

这段代码会随机返回一个小写字母。

2
你的 GetLetter 方法没有对 chars 做任何操作。为什么不直接生成一个在字符串长度范围内的随机数,并从该位置选择字符呢? - Tim
1
请访问以下链接:http://www.utf8-chartable.de/unicode-utf8-table.pl?utf8=dec 尝试在97和122之间进行操作! - Joffrey Kern
11个回答

44

你已经接近成功了 - 你想从一个字符串中返回一个随机元素,所以你只需要在字符串长度范围内生成一个随机数:

public static char GetRandomCharacter(string text, Random rng)
{
    int index = rng.Next(text.Length);
    return text[index];
}

顺便说一下,我建议不要使用没有任何锁定的Random类型的static变量 - Random不是线程安全的。请参阅我的关于随机数的文章以获取更多详细信息(和解决方法)。


如果 text.Length 生成为索引,您将在当前答案中得到一个 IndexOutOfRangeException - Hannes Kindströmmer
4
但是它不会这样,因为对于Random.Next()方法的参数来说,它是一个排除在外的上限。 - Jon Skeet

15
这可能适用于您:
public static char GetLetter()
{
    string chars = "$%#@!*abcdefghijklmnopqrstuvwxyz1234567890?;:ABCDEFGHIJKLMNOPQRSTUVWXYZ^&";
    Random rand = new Random();
    int num = rand.Next(0, chars.Length);
    return chars[num];
}

1
为什么不使用 return chars[num]; 呢? - John Willemse
有时候最简单的事情就是你忽略的事情 ;) 我很了解。 - John Willemse
告诉我吧...那些简单的事情总是会导致最大的问题 ;) - jordanhill123
简单的东西不够“企业级”!! - Chris Dunaway
使用 chars.Length -1,否则如果随机选择了最后一个元素,它可能会产生 OutOfRangeException。 - Alberto Romero

5
您可以这样使用它:
char[] chars = "$%#@!*abcdefghijklmnopqrstuvwxyz1234567890?;:ABCDEFGHIJKLMNOPQRSTUVWXYZ^&".ToCharArray();
Random r = new Random();
int i = r.Next(chars.Length);
Console.WriteLine(chars[i]);

这里有一个DEMO(演示),可以在这里查看。

4

你的代码很不错,只需要将 'a' 改为 'A' 就可以了

static Random random = new Random();
        public static char GetLetter()
        {
            // This method returns a random lowercase letter
            // ... Between 'a' and 'z' inclusize.
            int num = random.Next(0, 26); // Zero to 25
            char let = (char)('A' + num);
            return let;
        } 

这段代码与问题中提到的相同,只需更改char let = (char)('A' + num);,它会返回大写字母。
谢谢!

3

我不确定它的效率如何,因为我对编码非常陌生,但是,为什么不利用你已经创建的随机数呢?这样不会将大写字母“随机化”吗?

    int num = random.Next(0,26);           
    char let = (num > 13) ? Char.ToUpper((char)('a' + num)) : (char)('a' + num);

此外,如果您想从char[]中获取单个字母,使用字符串是否更容易?
    string charRepo = "$%#@!*abcdefghijklmnopqrstuvwxyz1234567890?;:ABCDEFGHIJKLMNOPQRSTUVWXYZ^&"; 
    Random rando = new Random();
    int ranNum = rando.Next(0, charRepo.Length);

    char ranChar = charRepo[ranNum];

3

请使用您的CHARS缓冲区大小,而不是26。

int num = random.Next(0, chars.Length)

那么,代替

的是:
let = (char)('a' + num)

使用

let = chars[num]

3

我曾遇到过类似的问题,我是这样解决的:

public static String GetRandomString()
{
    var allowedChars = "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ0123456789";
    var length = 15;

    var chars = new char[length];
    var rd = new Random();

    for (var i = 0; i < length; i++)
    {
        chars[i] = allowedChars[rd.Next(0, allowedChars.Length)];
    }

    return new String(chars);
}

2
private static void Main(string[] args)
        {
            Console.WriteLine(GetLetters(6));
            Console.ReadLine();
        }

        public static string GetLetters(int numberOfCharsToGenerate)
        {
            var random = new Random();
            char[] chars = "$%#@!*abcdefghijklmnopqrstuvwxyz1234567890?;:ABCDEFGHIJKLMNOPQRSTUVWXYZ^&".ToCharArray();

            var sb = new StringBuilder();
            for (int i = 0; i < numberOfCharsToGenerate; i++)
            {
                int num = random.Next(0, chars.Length);
                sb.Append(chars[num]);
            }
            return sb.ToString();
        }

1

从ASCII码中获取字符:

private string GenerateRandomString()
{
Random rnd = new Random();
string txtRand = string.Empty;
for (int i = 0; i <8; i++) txtRand += ((char)rnd.Next(97, 122)).ToString();
return txtRand;
}

1

我希望这段代码能帮助你:

 string s = "$%#@!*abcdefghijklmnopqrstuvwxyz1234567890?;:ABCDEFGHIJKLMNOPQRSTUVWXYZ^&";
            Random random = new Random();
            int num = random.Next(0, s.Length -1);
            MessageBox.Show(s[num].ToString());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接