乱数ジェネレーターは、整数と浮動小数点数をランダムに生成する C# の組み込みライブラリです。ライブラリの関連メソッドが呼び出されるたびに、乱数が返されます。一連の乱数は、どのパターンにも従わない一連の数値です。 C# の乱数ジェネレーターは、呼び出されるたびにこのような系列を生成する傾向があります。
次に頭に浮かぶ疑問は、なぜそれを擬似乱数生成クラスと呼ぶのかということです。これを実際の人間の行動から理解してみましょう。人間がランダムな色を選択するように求められると、特定の色を選択します。彼が黄色を選んだとしましょう。彼が黄色を選んだ理由は何ですか?それは彼の好きな色かもしれないし、周囲の色かもしれないし、あるいはその時彼は何か黄色のことを考えていたかもしれない。何かをランダムに選択するという決定を促すこの人間の行動は、ランダム性の世界ではシードと呼ばれます。シードは、ランダム性のトリガーまたは開始点です。
シードが予測可能であれば、乱数はそれほどランダムではなくなります。これらは擬似乱数と呼ばれます。予測できない場合、それらは安全な乱数と呼ばれます。
C# Random クラスは現在のタイムスタンプをシードとして使用しますが、これは非常に予測可能です。したがって、擬似乱数生成クラスという用語が使われます。
System.Security.Cryptography 名前空間の RNGCryptoServiceProvider クラスは、パスワードとして使用できる安全な乱数を生成できます。
C# で乱数を生成するには、まず Random クラスを初期化します。これは、クラスの 2 つのコンストラクターのいずれかによって実行できます。
ランダムな整数を生成する方法の例を見てみましょう:
以下の例は、ランダムな Int32 数値を生成します。
コード:
using System; public class Program { public static void Main() { Random rnd = new Random(); for (int i = 0; i < 10; i++) Console.WriteLine("Random number {0} : {1}", i + 1, GenerateRandomInt(rnd)); } public static int GenerateRandomInt(Random rnd) { return rnd.Next(); } }
出力:
以下の例では、0 ~ 100 の範囲のランダムな Int32 数値を生成します。
コード:
using System; public class Program { public static void Main() { Random rnd = new Random(); for (int i = 0; i < 10; i++) Console.WriteLine("Random number {0} : {1}", i + 1, GenerateRandomInt(rnd)); } public static int GenerateRandomInt(Random rnd) { return rnd.Next(100); } }
出力:
以下の例では、50 ~ 100 の範囲のランダムな Int32 数値を生成します。
コード:
using System; public class Program { public static void Main() { Random rnd = new Random(); for (int i = 0; i < 10; i++) Console.WriteLine("Random number {0} : {1}", i + 1, GenerateRandomInt(rnd)); } public static int GenerateRandomInt(Random rnd) { return rnd.Next(50, 100); } }
出力:
ランダムな浮動小数点数を生成する方法の例を見てみましょう:
以下の例は、ランダムな Int32 数値を生成します。
コード:
using System; public class Program { public static void Main() { Random rnd = new Random(); for (int i = 0; i < 10; i++) Console.WriteLine("Random number {0} : {1}", i + 1, GenerateRandomInt(rnd)); } public static double GenerateRandomInt(Random rnd) { return rnd.NextDouble(); } }
出力:
The most common mistake developers commit while generating random numbers is that for each random number, they create a new object of Random Class. As illustrated in the example below:
Code:
using System; public class Program { public static void Main() { for (int i = 0; i < 10; i++) Console.WriteLine("Random number {0} : {1}", i + 1, GenerateRandomInt()); } public static int GenerateRandomInt() { Random rnd = new Random(); //a very common mistake return rnd.Next(); } }
Output:
As explained in the working of Random Class, the numbers generated are based on the seed value and the current state of the machine. Any instance of Random class starts with the seed value, saves the current state and uses it to generate the next random number. In the code above, the mistake was to create a new instance of the Random class in every iteration of the loop. So, before the time in the internal clock changes, the code is fully executed, and each instance of Random class is instantiated with the same seed value. This results in the same set of numbers generated every time.
In this article, we learnt about the random number generator in C# and how it internally works to generate random numbers. We also briefly learnt the concept of pseudo-random and secure-random numbers. This information is sufficient for developers to use the Random class in their applications. Deep dive, if interested to explore more on random numbers for passwords and one-time passwords.
以上がC# の乱数ジェネレーターの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。