【问题标题】:Pick random char选择随机字符
【发布时间】:2013-02-21 08:23:32
【问题描述】:

我有一些字符:

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;
        }

此代码从字母表中返回一个随机字符,但只返回小写字母

【问题讨论】:

  • 您的GetLetter 方法对chars 没有任何作用。为什么不直接生成一个介于 0 和字符串长度之间的随机数,然后从随机生成的数字(即位置)中选择字符?
  • utf8-chartable.de/unicode-utf8-table.pl?utf8=dec 尝试在 97 和 122 之间!

标签: c# random char


【解决方案1】:

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

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

我建议反对使用Random 类型的static 变量而不使用任何锁定,顺便说一下-Random 不是线程安全的。请参阅我的article on random numbers 了解更多详细信息(和解决方法)。

【讨论】:

  • 如果text.Length 被生成为索引,您会在当前答案中获得IndexOutOfRangeException
  • @Brolaugh:但它不会,因为Random.Next 的参数是一个独占上限。
【解决方案2】:

这可能对你有用:

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

【讨论】:

  • 为什么不return chars[num];??
  • 有时最简单的事情就是你忽略的事情;)我都知道。
  • 告诉我......那些简单的事情总是导致最多的问题;)
  • 简单的事情还不够“企业”!!
  • 使用 chars.Length -1 ,否则,如果随机选择最后一个元素,可能会产生 OutOfRangeException。
【解决方案3】:

你可以像这样使用它;

char[] chars = "$%#@!*abcdefghijklmnopqrstuvwxyz1234567890?;:ABCDEFGHIJKLMNOPQRSTUVWXYZ^&".ToCharArray();
Random r = new Random();
int i = r.Next(chars.Length);
Console.WriteLine(chars[i]);

这是DEMO

【讨论】:

    【解决方案4】:

    我遇到了大概的问题,我是这样解决的:

    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);
    }
    

    【讨论】:

      【解决方案5】:

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

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

      然后代替

      let = (char)('a' + num)
      

      使用

      let = chars[num]
      

      【讨论】:

        【解决方案6】:

        我不确定它的效率如何,因为我对编码很陌生,但是,为什么不直接使用您已经创建的随机数呢?这不会“随机化”大写字符吗?

            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];
        

        【讨论】:

          【解决方案7】:
          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();
                  }
          

          【讨论】:

            【解决方案8】:

            您的代码很好,您只需将 '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);,它返回大写字母。

            谢谢!!!

            【讨论】:

              【解决方案9】:

              希望这段代码对你有帮助:

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

              【讨论】:

                【解决方案10】:

                从 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;
                }
                

                【讨论】:

                  【解决方案11】:

                  你可以试试这个:

                   public static string GetPassword()
                   {
                  string Characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
                   Random rnd = new Random();
                  int index = rnd.Next(0,51);
                  string char1 = Characters[index].ToString();
                  return char1;
                    }
                  

                  现在您可以根据自己的意愿使用此代码块。干杯!

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2020-02-04
                    • 1970-01-01
                    • 2020-06-07
                    • 1970-01-01
                    • 1970-01-01
                    • 2017-10-22
                    • 2013-10-28
                    • 1970-01-01
                    相关资源
                    最近更新 更多