スポンサーリンク
※サイト運営にサーバーは必須です※
~ ロリポップ! はコスパのよい初心者向けサーバーです~
乱数の生成法
C#には、乱数を生成するためにSystem.Random クラスが用意されています。
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Random02 { class Program { static void Main(string[] args) { Random r = new Random(); Console.WriteLine("Next()の場合"); for (int i = 0; i < 5; i++) { Console.WriteLine(r.Next()); } Console.WriteLine("-------------------------"); Console.WriteLine("Next(1,10)の場合"); for (int i = 0; i < 5; i++) { Console.WriteLine(r.Next(1,10)); } Console.WriteLine("-------------------------"); Console.WriteLine("Next(100)の場合"); for (int i = 0; i < 5; i++) { Console.WriteLine(r.Next(100)); } Console.WriteLine("-------------------------"); Console.WriteLine("NextDouble()の場合"); for (int i = 0; i < 5; i++) { Console.WriteLine(r.NextDouble()); } Console.WriteLine("-------------------------"); } } } |
実行結果
Next()の場合
1262663867
28650712
935573006
303305155
281132603
————————-
Next(1,10)の場合
2
8
2
6
5
————————-
Next(100)の場合
36
98
69
5
3
————————-
NextDouble()の場合
0.290854684678304
0.346791863602955
0.894016728687108
0.655401655312349
0.345866789736723
————————-
System.Random クラスをインスタンス化する時は、通常のクラス同様newを使用します。
System.Random クラスには以下のようなメソッドがあります。
Next();0 以上のランダムな整数
Next(int minValue, int maxValue); minValue 以上で maxValue 未満のランダムな整数
Next(int maxValue); 0 以上でmaxValue 未満のランダムな整数
NextDouble();0.0 以上 1.0 未満のランダムな倍精度浮動小数点数
注意点
・Nextメソッドで生成できる乱数の範囲はint型の範囲です。(int型の最大値は約21億です)。
・Next(int minValue, int maxValue)で指定した時に、maxValueの乱数は生成されません。説明にも書いた通り、minValue 以上で maxValue 「未満」です。「以下」ではありません。そのため、乱数の実質的な範囲はminValue~maxValue-1となります。例えばNext(1, 10)と書いて乱数を生成した時、1~10の乱数でなく、1~9の乱数が生成されます。
シード(seed)値
乱数を生成するには、シード(seed)値を指定する必要があります。
※seedは英語で「種」です。シード(seed)値は、乱数を生成するための種といえるでしょう。
乱数を生成する時に、シード(seed)値を指定することができます。シード(seed)値が固定だと常に同じ乱数を生成します。
以下の例では、シード(seed)値が10,20,10の場合を扱っています。1回目と3回目のシード(seed)値が10の場合に注目すると、生成される乱数は時間が経過しても変化しないことがわかります。
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Random03 { class Program { static void Main(string[] args) { Random r; r = new Random(10); Console.WriteLine("シード(seed)値が10の場合"); for (int i = 0; i < 100; i++) { Console.Write(r.Next(1, 10)); } Console.WriteLine(); Console.WriteLine("-------------------------"); r = new Random(20); Console.WriteLine("シード(seed)値が20の場合"); for (int i = 0; i < 100; i++) { Console.Write(r.Next(1, 10)); } Console.WriteLine(); Console.WriteLine("-------------------------"); r = new Random(10); Console.WriteLine("シード(seed)値が10の場合"); for (int i = 0; i < 100; i++) { Console.Write(r.Next(1, 10)); } Console.WriteLine(); Console.WriteLine("-------------------------"); } } } |
実行結果
シード(seed)値が10の場合
9777734529635793129223757958328133223216258426762563852613177521169358982316534129776628152123874736
————————-
シード(seed)値が20の場合
2778318556114895342157416421126745666173836554271877262437289843137934936922286334925867323889418352
————————-
シード(seed)値が10の場合
9777734529635793129223757958328133223216258426762563852613177521169358982316534129776628152123874736
————————-
シード(seed)値を指定しない場合は、時間に応じて決定される既定のシード値が使用されます。
正確に言えば、EnvironmentクラスのTickCountの値をシード(seed)値として使用しています。
TickCountは、パソコンが起動してから経過した時間(ミリ秒)をint型で返します。
そのため、シード(seed)値を固定した時と違い、「Random r = new Random();」で指定したrの値は、実行するたびに結果が変わります。
以下のソースコードは、非常に細かい時間の間に、System.Randomクラスを何度もインスタンス化しています。その結果、乱数の生成は何度もリセットされています。
シード(seed)値が変わった時に、生成される乱数が変わることがわかります。
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Random04 { class Program { static void Main(string[] args) { for (int j = 0; j < 10; j++) { Random r = new Random(); int seed = Environment.TickCount; for (int i = 0; i < 100; i++) { Console.Write(r.Next(10)); } Console.WriteLine(); Console.WriteLine("seedの値は" + seed); Console.WriteLine("-------------------------"); } } } } |
実行結果
6459192713358060274595570584952863523168321801217272088097950775059454600627476837677988542521754575
seedの値は207531312
————————-
9163393712108380969704235864441007195149562652643365600493852936009029482013267312008639769229663654
seedの値は207531328
————————-
9163393712108380969704235864441007195149562652643365600493852936009029482013267312008639769229663654
seedの値は207531328
————————-
9163393712108380969704235864441007195149562652643365600493852936009029482013267312008639769229663654
seedの値は207531328
————————-
9163393712108380969704235864441007195149562652643365600493852936009029482013267312008639769229663654
seedの値は207531328
————————-
9163393712108380969704235864441007195149562652643365600493852936009029482013267312008639769229663654
seedの値は207531328
————————-
7515100398171233293501750456557011350304188344768332510686564374016987399842241568821449077373970422
seedの値は207531343
————————-
7515100398171233293501750456557011350304188344768332510686564374016987399842241568821449077373970422
seedの値は207531343
————————-
7515100398171233293501750456557011350304188344768332510686564374016987399842241568821449077373970422
seedの値は207531343
————————-
7515100398171233293501750456557011350304188344768332510686564374016987399842241568821449077373970422
seedの値は207531343
————————-
~ギャンブルに絶対儲かる必勝法があるのだろうか?~
私(サイト主)はこの疑問に対して非常に興味を持ち、プログラミングで検証してみました。
このサイトを応援してもいいかなと思う人はぜひとも購入を検討してみてください。