1

我正在使用以下代码:

var a = (new Random()).Next(2);

这是在一个小循环内。每次它将 a 的值设置为零。有人可以就我做错了什么给我一些建议吗?

更新

感谢您提供的建议,但我仍然只看到一个数字:-( 这是我添加建议后的代码:

        var r1 = new Random();
        var r2 = new Random();

        foreach (var entry in this.ChangeTracker.Entries()
                     .Where(
                          e => e.Entity is IAuditableTable &&
                         (e.State == EntityState.Added) ||
                         (e.State == EntityState.Modified)))
        {
            IAuditableTable e = (IAuditableTable)entry.Entity;
            if (entry.State == EntityState.Added)
            {
                e.CreatedBy = r1.Next(2);
                e.CreatedDate = DateTime.Today.AddDays(-1 * r2.Next(30));
            }
            e.ModifiedBy = r1.Next(2);
            e.ModifiedDate = DateTime.Today.AddDays(-1 * r2.Next(30));
        }

CreatedBy 和 ModifiedBy 总是得到 0 :-(

4

2 回答 2

5

将随机创建移出循环:

var random = new Random();

foreach(var item in items)
{ 
   var a = random.Next(2);
   // ...
}

因为新的随机实例是用Environment.TickCount初始化的,即从上次机器启动开始的毫秒数,因此如果你创建它们的速度太快,随机实例将具有相同的种子(这意味着实例将返回完全相同的“随机”值):

public Random() : this(Environment.TickCount)
{
}

太快意味着在 Environment.TickCount 值更新之间的 16 毫秒内。

于 2013-07-06T06:45:58.890 回答
0

正确的方法是:

var random = new Random();
while (true)
{
  var a = random.Next(2);
  // use a
}
于 2013-07-06T06:48:55.880 回答