スポンサーリンク
※サイト運営にサーバーは必須です※
~このサイトもエックスサーバーを使用しています~
目次
はじめに
C#で、乱数を発生させようとしても、同じ数字が出力される。
なぜ、ランダムに乱数が発生してくれない?
※この記事を書いている人間はC#の初心者なので、以下で書いていること全て正しいという保証はできない
※Visual Studio 2015でプログラムを動かしている
C#での乱数発生
失敗例
0~9までの乱数を発生させるを100回行うプログラム
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 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace rand1 { class Program { static void Main(string[] args) { for (int i = 1; i <= 100; i++) { int seed = Environment.TickCount; Random rnd = new System.Random(); // インスタンスを生成 int r = rnd.Next(10); // 0~9の乱数を取得 Console.Write(r); }//for(i)文の終わり } } } |
結果
常に同じ数字(数字の6)が出力される
ちなみに繰り返しを100回から2000回に増やすと以下のような結果となった。
c#の乱数は、時間を参照しているらしい。(参照している時間は、たぶん、PCの起動時間)
乱数が参照している時間が変化するよりも早く、forのループ文が回ると、その間の結果は変わらないのだろう。
成功例
次は
1 2 |
int seed = Environment.TickCount; Random rnd = new System.Random(); |
の部分をfor文の外で宣言する
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 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace rand1 { class Program { static void Main(string[] args) { int seed = Environment.TickCount; Random rnd = new System.Random(); // インスタンスを生成 for (int i = 1; i <= 100; i++) { int r = rnd.Next(10); // 0~9の乱数を取得 Console.Write(r); }//for(i)文の終わり } } } |
結果
なんだか、それっぽい乱数を得られた。
もう一度実行してみると結果が変わる
乱数を発生させようとするたびに、乱数用のインスタンスを新たに生成するのがまずかったのだろう。
for文の中に、インスタンスを生成すると、常に1回目の乱数生成することになる。
一方で、インスタンスを生成する部分をfor文の外に追い出すと、乱数を1度発生させた後、そのことを受けて、次の乱数を発生させるのだと考えられる。
~Webサイトを自分で作ってみませんか?~
Webサイトを運営するにはサーバーが必須です。
このサイトは、エックスサーバー のサーバーを使用しています。
エックスサーバーは無料で10日間お試しができます。
んあ!めちゃめちゃ参考になります!ありがとうございます!