0

次の方法を使用してランダムなProductリストを生成しようとしていますが、同じProductインスタンスを複数回取得しています。

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

私は参照型であるリスト型を読みました、そしてそれはものを上書きします。以下は私のコードです。ユニークなProductインスタンスを提供できるものがありませんか?ありがとう&私はあなたの助けをいただければ幸いです。

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()のが同一のシードを持つランドムを生成します。

forループの外側で一度宣言すると、より適切な値が得られるはずです。

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

確率変数の作成を2行上に移動します。

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

それ以外の場合は、forループの実行が速すぎるため、ランダムに常に同じシードを使用しています。Randomコンストラクターは現在の時刻を使用します。newと同等Random(Environment.TickCount)です。

デフォルトのシード値はシステムクロックから取得され、有限の解像度を持っています。その結果、デフォルトコンストラクターの呼び出しによって連続して作成されるさまざまなランダムオブジェクトは、同一のデフォルトシード値を持つため、同一の乱数セットが生成されます。この問題は、単一の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 に答える