6

次よりも3桁の乱数を生成するより良い方法はありますか:

var now = DateTime.Now.Ticks.ToString(CultureInfo.InvariantCulture);
string my3digitrandomnumber = now.Substring(now.Length - 7, 3);

ありがとう..

4

5 に答える 5

21

はい - 現在のコードはまったくランダムではありません。システム時間に基づいています。特に、これを同時に複数のスレッドから使​​用する場合、または同じスレッド内で立て続けに数回使用する場合でも、毎回同じ数が得られます。

RandomまたはRandomNumberGenerator(より安全です) を使用する必要があります。

たとえば、 のインスタンスを取得したら、次のようにRandom使用できます。

int value = rng.Next(1000);
string text = value.ToString("000");

(これは、数字をテキストとして使用することを前提としています。3 桁であることが保証されている整数rng.Next(100, 1000)が必要な場合は、 を使用します。)

ただし、次の点に注意が必要Randomです。

  • 使用するたびに新しいインスタンスを作成する必要はありません。シードを指定しない限り、これも時間ベースになります
  • スレッドセーフではありません

したがって、理想的には、おそらくスレッドごとに 1 つ必要です。ランダム性に関する私の記事では、これについて詳しく説明し、いくつかのサンプル コードを提供しています。

于 2013-01-22T18:42:05.917 に答える
6
int r = (new Random()).Next(100, 1000);
于 2013-01-22T18:41:57.960 に答える
4

RandomクラスとコールをNext(10)3 回使用できます。

于 2013-01-22T18:40:51.053 に答える
2

ええと、まずそれはあなたがそこに持っている奇妙な設定です。なぜ最初に日付を取得するのですか?

これを使用して、3 桁 (1000 未満) の数字を取得する必要があります。

Random rand = new Random(); // <-- Make this static somewhere

const int maxValue = 999;
string number = rand.Next(maxValue + 1).ToString("D3"); 

これmaxValue + 1は、パラメータ forRandom.Next(int)が排他的な上限であるためです。つまり、返される数値は常にパラメータよりも小さくなります。それは決して等しくあり得ません。

于 2013-01-22T18:42:37.797 に答える
-1
new Random.NextDouble() * 1000
于 2013-01-22T18:44:25.857 に答える