2

次のメソッドは、指定された長さのランダムな文字列を生成します。

2回続けて実行すると、同じ文字列が与えられます。なぜこれが起こるのか、誰かが光を当てることができますか?

 public static string GenerateRandomString(int size, bool lowerCase)
        {
            StringBuilder builder = new StringBuilder();
            Random random = new Random();
            char ch;
            for (int i = 0; i < size; i++)
            {
                ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65)));
                builder.Append(ch);
            }
            if (lowerCase)
                return builder.ToString().ToLower();
            return builder.ToString();
        }
4

4 に答える 4

8

Random正しく使用していません。

タイトなループであなたを呼び出すときGenerateRandomString、それは何度も同じ値にシードされることになります。

Jon SkeetによるC#の詳細サイトから乱数を読むことをお勧めします。

Randomインスタンスを取得するための推奨される方法は次のとおりです。

using System;
using System.Threading;



public static class RandomProvider
{    
    private static int seed = Environment.TickCount;

    private static ThreadLocal<Random> randomWrapper = new ThreadLocal<Random>(() =>
        new Random(Interlocked.Increment(ref seed))
    );

    public static Random GetThreadRandom()
    {
        return randomWrapper.Value;
    }
}
于 2012-05-28T13:07:07.353 に答える
2

静的なランダムオブジェクトを作成する

public class MyClass
{
   public static Random rand = new Random();

   public int MyMethod()
   {
       return rand.Next() % 10 + 1;
   }
}

ランダムで動作しSystem.DatTime.Now.Ticksます。

これが好きなら

Random rand = new Random();

内部的には次のように発生します

Random rand = new Random(System.DateTime.Now.Ticks);

ちょっと考えてみてください。システムで一定ではない唯一の考えはシステム時間です。

Randomクラスを使用するときは、そのオブジェクトを1回作成し、必要に応じてそのメソッドを使用してNext()ください。この状況は、ランダムオブジェクトがループ内に作成されるときにループで発生します。

コードでは、それらは次々に作成され、同じTicksシード値によって作成されます。

静的なランダムオブジェクトを作成すると、それらは同じになりません。

于 2012-05-28T13:07:57.007 に答える
1

2回続けて実行した速度はどれくらいですか?ランダムのシードは時間に依存するため、プログラムでテストしている場合、これが発生する可能性があります。Randomオブジェクトを他の場所で一度作成してから、メソッドで参照します。

于 2012-05-28T13:09:49.687 に答える
1

オブジェクトをメソッドの外に移動Randomして、同じオブジェクトが繰り返しの呼び出しで使用されるようにします。

static Random random = new Random();

現在の問題は、Randomクラスが現在の時刻をシード値として使用するため、2回連続して作成された場合、両方が同じシードを持ち、同じランダム文字列を生成することです。

于 2012-05-28T13:10:54.987 に答える