C# 为什么静态方法有时会为单独的调用返回相同的结果?

C# 为什么静态方法有时会为单独的调用返回相同的结果?,c#,static-methods,C#,Static Methods,在我的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.Nex

在我的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;
    }
}
公共类随机密钥
{
公共静态字符串GetKey()
{
随机rng=新随机();
char[]chars=新字符[8];
for(int i=0;i
我从另一个类的方法调用这个函数

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

对于(int i=0;i,原因是您正在初始化方法内部的
随机对象。
当您在接近时间的情况下(如在循环中)调用该方法时,
Random
对象将使用相同的种子进行初始化。(请参阅以了解原因)。
为了避免这种情况,您应该将
随机
对象声明并初始化为静态字段,如下所示:

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

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

原因是您正在初始化方法中的
Random
对象。
当您在接近时间的情况下(如在循环中)调用该方法时,
Random
对象将使用相同的种子进行初始化。(请参阅以了解原因)。
为了避免这种情况,您应该将
随机
对象声明并初始化为静态字段,如下所示:

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

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

继续重新初始化随机值。将其移到静态字段。还可以使用格式化程序使用
ToString
将数字格式化为十六进制


另外,
DateTime。现在
是个坏主意。有关分配唯一时间戳值的更好方法,请参阅。

您一直在重新初始化随机值。将其移到静态字段。此外,您还可以使用格式化程序使用
ToString
以十六进制格式格式化数字


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

在使用
Random()的无参数构造函数时,在静态方法之外声明Random()
它使用
环境。TickCount
作为种子,它只会每隔几毫秒更改一次。因此,如果调用太快,则会导致使用相同种子构造的连续实例,从而导致相同的随机数序列。@MatthewWatson:您的注释比发布的答案更好。您应该回答我们r而不是评论;)@falan正确的方法是duplicate@Falanwe:你认为哪种方式更好?我已经在回答中解释了这个问题(我承认没有那么详细),并提出了一个解决方案(马修的评论没有)。那么,是什么让它更好呢?declare Random()在静态方法之外,当您为
Random()使用无参数构造函数时
它使用
环境。TickCount
作为种子,它只会每隔几毫秒更改一次。因此,如果调用太快,则会导致使用相同种子构造的连续实例,从而导致相同的随机数序列。@MatthewWatson:您的注释比发布的答案更好。您应该回答我们r而不是评论;)@falan正确的方法是duplicate@Falanwe当前位置你认为哪种方式更好?我在回答中已经解释了这个问题(我承认没有太多细节),并提出了一个解决方案(马修的评论没有).那么,是什么让它变得更好呢?Q很多人错过了,不要太担心。Q很多人错过了,不要太担心。