C# の乱数ジェネレーター

WBOY
WBOYオリジナル
2024-09-03 15:34:50702ブラウズ

乱数ジェネレーターは、整数と浮動小数点数をランダムに生成する C# の組み込みライブラリです。ライブラリの関連メソッドが呼び出されるたびに、乱数が返されます。一連の乱数は、どのパターンにも従わない一連の数値です。 C# の乱数ジェネレーターは、呼び出されるたびにこのような系列を生成する傾向があります。

C# のランダム クラス

  • それでは、C# はどのようにして一連の乱数を生成するのでしょうか?答えは、C# System 名前空間の Random クラス内にあります。
  • Random クラスは、擬似乱数生成クラスです。これは、このクラスがどのパターンにも従わない一連の数値を生成するタスクを負っていることを意味します。しかし、機械は本当に乱数を生成できるのでしょうか?マシンは次にどの数値を生成するかをどうやって知るのでしょうか?結局のところ、マシンは命令に従ってアルゴリズムを実行するように設計されています。
  • いいえ、マシンは独自に乱数を生成できません。現在のクロックとマシンの状態に基づいて、セットから数値を選択するように導く定義された数学的アルゴリズムがあります。セット内のすべての数字が選択される確率は同じです。したがって、それらは完全にランダムではありません。彼らはあるパターンに従います。ただ、パターンが人間の実際の要件を満たすのに十分ランダムであるというだけです。

擬似的で安全

次に頭に浮かぶ疑問は、なぜそれを擬似乱数生成クラスと呼ぶのかということです。これを実際の人間の行動から理解してみましょう。人間がランダムな色を選択するように求められると、特定の色を選択します。彼が黄色を選んだとしましょう。彼が黄色を選んだ理由は何ですか?それは彼の好きな色かもしれないし、周囲の色かもしれないし、あるいはその時彼は何か黄色のことを考えていたかもしれない。何かをランダムに選択するという決定を促すこの人間の行動は、ランダム性の世界ではシードと呼ばれます。シードは、ランダム性のトリガーまたは開始点です。

シードが予測可能であれば、乱数はそれほどランダムではなくなります。これらは擬似乱数と呼ばれます。予測できない場合、それらは安全な乱数と呼ばれます。

C# Random クラスは現在のタイムスタンプをシードとして使用しますが、これは非常に予測可能です。したがって、擬似乱数生成クラスという用語が使われます。

RNGCryptoServiceProvider クラス

System.Security.Cryptography 名前空間の RNGCryptoServiceProvider クラスは、パスワードとして使用できる安全な乱数を生成できます。

C# の乱数生成関数

C# で乱数を生成するには、まず Random クラスを初期化します。これは、クラスの 2 つのコンストラクターのいずれかによって実行できます。

  • Random(): 時間ベースのシード値を使用して Random クラスのオブジェクトを初期化します。シード値はマシンの現在のタイムスタンプです。ただし、後のバージョンでは、これは GUID ベースに変更されました。
  • Random(Int32): 指定されたシード値を使用して Random クラスのオブジェクトを初期化します。系列から次の乱数を取得するには、Random クラスの Next() メソッドを呼び出します。
  • Next(): 非負の擬似乱数 Int32 整数を返します。
  • Next(Int32): 指定された整数より小さい非負の擬似乱数 Int32 整数を返します。
  • Next(Int32, Int32): 指定された範囲内の非負の擬似乱数 Int32 整数を返します。

C# の乱数ジェネレーター整数

ランダムな整数を生成する方法の例を見てみましょう:

例 #1

以下の例は、ランダムな 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();
}
}

出力:

C# の乱数ジェネレーター

例 #2

以下の例では、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);
}
}

出力:

C# の乱数ジェネレーター

例 #3

以下の例では、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);
}
}

出力:

C# の乱数ジェネレーター

C# での浮動小数点数の生成

ランダムな浮動小数点数を生成する方法の例を見てみましょう:

例 #1

以下の例は、ランダムな 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();
}
}

出力:

C# の乱数ジェネレーター

A Very Common Mistake

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:

Example #1

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:

C# の乱数ジェネレーター

How Random Numbers are all the same and Why did this happen?

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.

Conclusion

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。