1

次のコードを使用しています。

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

これは小さなループの内側です。a の値をゼロに設定するたびに。誰かが私が間違っていることについてアドバイスをくれますか?

アップデート

与えられたアドバイスに感謝しますが、まだ1つの数字しか表示されません:-(提案を追加した後のコードは次のとおりです:

        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 に答える