【问题标题】:how to take a random element out of an array in C# [duplicate]如何在C#中从数组中取出随机元素[重复]
【发布时间】:2022-01-25 11:28:18
【问题描述】:

我试图在下面的代码中从我的数组中取出一个随机元素:

                char[] vs = new char[] { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '1', '2', '3', '4', '5', '6', '7', '8', '9', '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '-', '_', '+', '=', '|', ':', };
                string strng = null;

                Console.WriteLine(vs.Length);
                while (u <= 536870912)
                {
                    Random random = new Random();
                    random.Next(0, 51);
                    int rndm = Convert.ToInt32(random);
                    strng = strng + "" + vs[rndm];

                }
                Console.WriteLine(strng);

所以每当我尝试运行它时,它都会给我一个未处理的异常,这里是:

52
System.InvalidCastException: Unable to cast object of type 'System.Random' to type 'System.IConvertible'.
   at System.Convert.ToInt32(Object value)
   at ConsoleApp1.Program.Main()

整个代码的主要目的是从数组中生成随机字符,只要小于 512 兆字节(可以在代码中注意到),如果您有任何想法,请帮我解决这个问题,谢谢!

【问题讨论】:

  • 问题已经回答here
  • random 是您的随机化器类实例,而不是 Next() 调用的结果,因此您的 Convert.ToInt32 将失败。您应该将random.Next() 的结果存储到变量int rndm = random.Next(0, 51); 中。
  • 由于迭代次数很大,您应该意识到,您的场景中的字符串连接性能会很差。考虑使用 StringBuilder 代替进行测试连接
  • 您永远不会更新u,您可能需要将new Random() 行移出循环(这样您就可以重复使用一个实例)
  • 预分配一个 512mb 的 char[],然后循环分配一个新的随机字符到每个位置。最后把它变成一个字符串。 var arr = new char(512*1024*1024]; for(int i = 0; i &lt; arr.Length; i++) arr[i] = vs[r.Next(vs.Length)];

标签: c# arrays random console-application


【解决方案1】:

您应该将random.Next() 方法的返回值存储到一个变量中。 (问题是您尝试将类实例转换/转换为 int。)

using System;
                    
public class Program
{
    public static void Main()
    {
        int u=0;
        
        char[] vs = new char[] { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '1', '2', '3', '4', '5', '6', '7', '8', '9', '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '-', '_', '+', '=', '|', ':', };
        string strng = null;

        Console.WriteLine(vs.Length);
        // just create an instance of the Random class once.
        Random random = new Random();

        while (u <= 10)
        {
            // store the random value into rndm (it's already an int)
            var rndm = random.Next(0, vs.Length);
            strng = strng + vs[rndm];
            u++;
        }
        Console.WriteLine(strng);
    }
}

【讨论】:

  • Nooo.. 这是构建 512mb 字符串的糟糕方法。此外,您不需要(也不应该)手动从时钟播种;在旧的 .net 中,Random 将从时钟中播种。在新的 .net 中它没有(从时钟播种是一个坏主意;不鼓励)
  • 当然,“只要小于 512 兆字节”,但这个答案是为了准确指出问题所在。当然这是一个糟糕的方法,还有很多更好的方法。这不应该是一个字符串。如果种子自动完成,我会更新代码,谢谢添加。
猜你喜欢
  • 2011-11-01
  • 2023-01-28
  • 2018-10-23
  • 1970-01-01
  • 2012-01-23
  • 2019-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多