【发布时间】: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 < arr.Length; i++) arr[i] = vs[r.Next(vs.Length)];
标签: c# arrays random console-application