由于某些原因,当我不在Random类中使用种子时,此代码可以很好地工作,但如果我尝试使用DateTime。现在,为了获得更随机的数字,我得到了StackOverflowException!我的课真的很简单。有人能告诉我我在这里做错了什么吗?请参阅MakeUniqueFileName。
public class TempUtil
{
private int strcmp(string s1, string s2)
{
try
{
for (int i = 0; i < s1.Length; i++)
if (s1[i] != s2[i]) return 0;
return 1;
}
catch (IndexOutOfRangeException)
{
return 0;
}
}
private int Uniqueness(object randomObj)
{
switch (randomObj.ToString())
{
case "System.Object":
case "System.String":
return randomObj.ToString()[0];
case "System.Int32":
return int.Parse(randomObj.ToString());
case "System.Boolean":
return strcmp(randomObj.ToString(), "True");
default:
return Uniqueness(randomObj.ToString());
}
}
public string MakeUniqueFileName()
{
return "C:\windows\temp\" + new Random(Uniqueness(DateTime.Now)).NextDouble() + ".tmp";
}
}
您正在调用DateTime.Now.ToString()
,它不会为您提供要检查的字符串之一。。。所以你在递归,用同一个字符串调用它。。。仍然不是您要查找的字符串之一。
您不需要使用Random
来演示该问题。这将很容易做到:
Uniqueness(""); // Tick, tick, tick... stack overflow
你期望它做什么?目前还不清楚您的代码意味着要做什么,但我建议您完全放弃Uniqueness
方法。事实上,我建议您去掉整个类,改用Path.GetTempFileName
。
简而言之:
应该说
switch (randomObj.GetType().ToString())
而不是
switch (randomObj.ToString())
但即便如此,这也不是很聪明。
您正在将DateTime
实例传递给Uniqueness
方法。
这会失败,并用ToString
调用自己——在DateTime
实例上,这将是一个格式化的DateTime
字符串(如"21/01/2011 13:13:01"
)。
由于这个字符串(再次)与您的任何开关情况都不匹配,该方法再次调用自己,但对字符串调用ToString
的结果是相同的字符串。
您已经导致了一个无限调用堆栈,导致StackOverflowException
。
不需要调用Uniquness
——创建Random
实例时,无论如何都将基于当前时间。
我建议阅读C#深度网站上的随机数。
Random
的无参数构造函数已经使用当前时间作为种子值。它使用内部用于表示DateTime
的时间刻度。
然而,这种方法的一个问题是,与CPU时钟频率相比,时钟的滴答声非常慢。如果每次需要一个随机值时都创建一个Random
的新实例,那么可能是因为时钟在两次调用之间没有滴答作响,从而生成了两次相同的随机数。
您可以通过创建Random
的单个实例来简单地解决这个问题。
public class TempUtil {
private static readonly Random random = new Random();
public string MakeUniqueFileName()
{
return @"C:windowstemp" + random.NextDouble() + ".tmp";
}
}
这将生成非常好的随机数。
顺便说一下
System.IO.Path.GetTempFileName()
自动创建一个具有唯一名称的空临时文件,并返回该文件的完整路径。
从哪里开始。1.已经存在字符串比较。使用它。它已经调试好了。2.你的独特功能不合逻辑。前两个大小写项返回一个"S",可能转换为int。您忽略了第一个大小写的break。
您的第三种情况是这样的:if(x="System.Int32")返回int.Parse("System.int三十二");这可能会返回32或解析错误。
你的第四个案例是这样的:if(x="System.Boolean")返回strcmp("System.Boo布尔","True");您的默认情况被递归调用(sp),导致堆栈溢出(请参阅上面的注释)
为了修复这个程序,我建议你至少读一本关于C#的好书,然后重新思考你的程序,然后写它。也许Javascript会更适合。