代码之家  ›  专栏  ›  技术社区  ›  jkelley

在从ASP.Net网页调用的类库中正确设置随机数种子

  •  0
  • jkelley  · 技术社区  · 15 年前


    public static T GetRandomValue<T>(T[] array)
    {            
        int ndx = new Random().Next(array.Length);
        return array[ndx];            
    }
    

    在系统时钟改变之前,它会从另一个方法重复调用,因此它会使用相同的随机种子进行初始化,并给出相同的值。(见 SO article for apparently malfunctioning random number generator )它用于为某些文本生成算法选择随机格式字符串。因为每次使用同质格式字符串生成不同的文本位时,都会以快速顺序调用它,这对于应用程序来说是不可取的。

    它通常是从asp.net网页调用的,我想知道最好的方法是生成一个随机序列,而不给重复调用该方法的页面造成性能问题。

    public class Utility
    {
        public static Random random = new Random();
        public static T GetRandomValue<T>(T[] array)
        {            
            int ndx = random.Next(array.Length);
            return array[ndx];            
        }
    }
    

    可能还需要锁定“随机”和“ndx”。对于在类库中处理这种类型的种子设定,通常有更好的做法吗?

    2 回复  |  直到 8 年前
        1
  •  1
  •   Community CDub    8 年前

    我通常做如下的事情。

    public class Utility
    {
        public static readonly Random MyRandomGenerator = new Random();
    
        static Utility()
        {
        }
    }
    

    编辑:我几乎总是在做这样的事情时包含一个静态构造函数,因为 beforefieldinit 旗帜看到这个了吗 other post .

        2
  •  0
  •   pyrocumulus    15 年前

    第二种方法更好。第一个不保证是随机字符串;您可能得到的数组实际上填充了相同的值。更重要的是,我认为第二种方法在性能方面更好,因为您只创建了一种 Random 整个应用程序的生成器。

    我甚至认为只有当工作进程回收时,它才会被重新实例化(有人能验证这一点吗?)。