0

我正在尝试使用以下方法生成随机产品列表,但我多次获得相同的产品实例。

Output for count 5:
Name: Qmlcloboa Price: 3.608848
Name: Qmlcloboa Price: 3.608848
Name: Qmlcloboa Price: 3.608848
Name: Qmlcloboa Price: 3.608848
Name: Qmlcloboa Price: 3.608848

我读到 List 类型是一种引用类型,它会覆盖东西。下面是我的代码。我是否遗漏了一些可以为我提供独特产品实例的东西?谢谢,我会很感激你的帮助。

public List<Product> ProductGroupGenerator(int count)
    {
        List<Product> pList = new List<Product>();

        for (int i = 0; i < count; i++)
        {
            Random r = new Random();
            string alphabet = "abcdefghijklmnopqrstuvwyxzeeeiouea";
            Func<char> randomLetter = () => alphabet[r.Next(alphabet.Length)];
            Func<int, string> makeName =
              (length) => new string(Enumerable.Range(0, length)
                 .Select(x => x == 0 ? char.ToUpper(randomLetter()) : randomLetter())
                 .ToArray());

            //string last = makeName(r.Next(7) + 7);
            //string company = makeName(r.Next(7) + 7) + " Inc.";

            string prodName = makeName(r.Next(5) + 5);
            int unitsInStock = r.Next(100);
            float unitPrice = (float)(r.NextDouble() * 10);

            Product p = new Product();
            p.Name = prodName;
            p.UnitsInStock = unitsInStock;
            p.UnitPrice = unitPrice;

            pList.Add(p);

            p = null;
        }

        return pList;
    }
4

4 回答 4

7

当调用太快时,多个Random r = new Random()'s 将产生具有相同种子的随机数。

在 for 循环之外声明一次,你应该有更好的值。

    Random r = new Random();
    for (int i = 0; i < count; i++)
    {
于 2012-09-25T20:14:12.703 回答
4

将 Random 变量的创建移到顶部两行:

Random r = new Random();
for (int i = 0; i < count; i++)
{

否则,您总是对随机数使用相同的种子,因为 for 循环执行得太快。构造Random函数使用当前时间。它相当于 new Random(Environment.TickCount)

默认种子值来自系统时钟并且具有有限的分辨率。因此,通过调用默认构造函数连续创建的不同 Random 对象将具有相同的默认种子值,因此将产生相同的随机数集。这个问题可以通过使用单个 Random 对象来生成所有随机数来避免。

于 2012-09-25T20:15:33.927 回答
0

尝试创建 的单个实例,并在循环Random期间使用它。for每次创建 的实例时Random,它都会重置种子,因此每次调用都会获得相同的值。

于 2012-09-25T20:15:55.957 回答
0

随机播种

Random r = new Random(DateTime.Now.Millisecond);

另外,在循环之外声明它。

于 2012-09-25T20:16:11.093 回答