【问题标题】:Why Static method sometimes returns same result for separate call?为什么静态方法有时会为单独的调用返回相同的结果?
【发布时间】:2015-08-23 19:18:01
【问题描述】:

在我的 c# 代码中,我有一个静态方法。这是代码示例:

public class RandomKey
{
    public static string GetKey()
    {
        Random rng = new Random();
        char[] chars = new char[8];
        for (int i = 0; i < chars.Length; i++)
        {
            int v = rng.Next(10 + 26 + 26);
            char c;
            if (v < 10)
            {
                c = (char)('0' + v);
            }
            else if (v < 36)
            {
                c = (char)('a' - 10 + v);
            }
            else
            {
                c = (char)('A' - 36 + v);
            }
            chars[i] = c;
        }

        string key = new string(chars);
        key += DateTime.Now.Ticks.ToString();
        return key;
    }
}

我从另一个类的方法调用这个函数。

Class SomeClass
{
    Void SomeMethod()
    {
        for(int i=0; i<100; i++)
        {
            System.Diagnostics.Debug.WriteLine(i + "===>" + RandomKey.GetKey());
        }
    }
}

但现在的问题是有时我会从静态方法获得相同的输出,尽管该函数是单独调用的。我的代码有问题吗?

【问题讨论】:

  • 在静态方法之外声明 Random()
  • 当你对Random() 使用无参数构造函数时,它使用Environment.TickCount 作为种子,它每隔几毫秒就会改变一次。因此,如果您调用得太快,您最终会得到使用相同种子构造的连续实例,因此会产生相同的随机数序列。
  • @MatthewWatson :您的评论比发布的答案更好。你应该回答而不是评论;)
  • @falan 正确的方法是关闭为重复
  • @Falanwe:您认为哪种方式更好?我已经在我的回答中解释了这个问题(我承认细节较少)并提出了一个解决方案(马修的评论没有。)。那么,是什么让它变得更好呢?

标签: c# static-methods


【解决方案1】:

原因是您在方法内部初始化Random 对象。
当您在近距离调用该方法时(如在循环内),Random 对象将使用相同的种子进行初始化。 (请参阅Matthew Watsoncomment 了解原因。)
为防止您应该将Random 对象声明和初始化为静态字段,如下所示:

public class RandomKey
{
    static Random rng = new Random();

    public static string GetKey() 
    {
    // do your stuff...
    }
}

【讨论】:

  • Q 很多人都错过了,不要太担心。
【解决方案2】:

您不断重新初始化 Random 值。将其移至静态字段。您还可以使用带有格式化程序的ToString 以十六进制格式格式化数字。

另外,DateTime.Now 是个坏主意。请参阅this answer,了解分配唯一时间戳值的更好方法。

【讨论】:

    猜你喜欢
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2016-08-27
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多