スポンサーリンク
※サイト運営にサーバーは必須です※
~ ロリポップ! はコスパのよい初心者向けサーバーです~
目次
はじめに
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度発生させた後、そのことを受けて、次の乱数を発生させるのだと考えられる。
~ギャンブルに絶対儲かる必勝法があるのだろうか?~
私(サイト主)はこの疑問に対して非常に興味を持ち、プログラミングで検証してみました。
このサイトを応援してもいいかなと思う人はぜひとも購入を検討してみてください。
んあ!めちゃめちゃ参考になります!ありがとうございます!