我正在尝试使用以下方法生成随机产品列表,但我多次获得相同的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
我在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;
}
答案 0 :(得分:7)
当调用太快时,多个Random r = new Random()
会生成具有相同种子的Randoms。
在for循环之外声明它一次,你应该有更好的值。
Random r = new Random();
for (int i = 0; i < count; i++)
{
答案 1 :(得分:4)
将Random变量的创建移动到顶部:
Random r = new Random();
for (int i = 0; i < count; i++)
{
否则你总是为随机使用相同的种子,因为for循环执行得太快。 Random
构造函数使用当前时间。它相当于新的Random(Environment.TickCount)
。
默认种子值是从系统时钟派生的,并且是有限的 解析度。结果,创建了不同的Random对象 通过调用默认构造函数来关闭连续 相同的默认种子值,因此,将产生相同的 随机数集。使用单个可以避免此问题 随机对象生成所有随机数。
答案 2 :(得分:0)
尝试创建Random
的单个实例,并在for
循环期间使用该实例。每次创建Random
的实例时,它都会重置种子,因此您将为每次调用获得相同的值。
答案 3 :(得分:0)
随机播种
Random r = new Random(DateTime.Now.Millisecond);
另外,在循环之外声明它。