随机数生成器中的c#



由于某些原因,当我不在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会更适合。

最新更新