【问题标题】:Properly Seeding Random numbers in Class Library called from ASP.Net Web Page在从 ASP.Net 网页调用的类库中正确播种随机数
【发布时间】:2010-12-09 03:19:55
【问题描述】:

我的类库中的随机数生成器重复返回相同的值时遇到问题。它返回与使用默认构造函数重复初始化的相同值 b/c - 例如:

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];            
    }
}

可能还需要锁定“random”和“ndx”。一般而言,在类库中处理这种类型的种子是否有更好的做法?

【问题讨论】:

    标签: c# asp.net random


    【解决方案1】:

    我通常会做如下的事情。

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

    然后只需调用 Utility.MyRandomGenerator 就好像它是一个常规的 {get;} 属性。

    编辑:当我做这样的事情时,我几乎总是包含一个静态构造函数,因为beforefieldinit 标志的疯狂。看到这个other post

    【讨论】:

      【解决方案2】:

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

      我什至认为它只会在工作进程回收时重新实例化(任何人都可以验证这一点吗?)。

      【讨论】:

        猜你喜欢
        • 2012-09-01
        • 2023-03-18
        • 2010-11-12
        • 2023-01-12
        • 2011-07-24
        • 2015-05-10
        • 2011-08-29
        • 1970-01-01
        • 2010-10-05
        相关资源
        最近更新 更多