読者です 読者をやめる 読者になる 読者になる

へっぽこびんぼう野郎のnewbie日記

けろけーろ(´・ω・`)!

Randomなのに同じものを選びまくられてハマった。ランダムっていうのはデタラメに選ぶことじゃないんだ。

C#

Random random = new Random();

C#でこのように書くことは、一見何の問題もなさそうに思える。

しかしこの書き方は問題である。

例えば次のような書き方は、違う乱数を返してくれるように思える。

 

output

$ mono TimesRandom.exe 

9:9:9

$ mono TimesRandom.exe

7:7:7

$ mono TimesRandom.exe

1:0:0

$ mono TimesRandom.exe

9:9:9

$ mono TimesRandom.exe

7:6:6

$ mono TimesRandom.exe

3:3:3 

しかし結果は、THE なんじゃこりゃあああああああああああああである。

ランダムのかけらもない。

この値は、ミリ秒のようなものをもとにして作られているようだ。

だからちゃんと乱数のもととなるseedを渡してあげなければいけない。

seedを渡すことで、randomさんがそれなりの値に変換してくれるようだ。

 

あ、monoっていうのはLinux上で.NETとかの.exeを立ち上げるものだから、

Windowsの場合は気にせず、TimesRandom.exeと打てばおっけい。

monoのくわしいところはシラネ。

 

たとえば上のものを

Random random = new Random(1);

というようにseedを固定してあげると、

$ mono Random123.exe 

5:5:5

$ mono Random123.exe 

5:5:5

$ mono Random123.exe 

5:5:5

$ mono Random123.exe 

5:5:5

$ mono Random123.exe 

5:5:5

$ mono Random123.exe 

5:5:5

という出力になる。 なんじゃこりゃあ再びである。しかもこっちは常に同じ。

 

別に毎回固定されるのが悪いとかではなく、

固定されないとむしろ困るけど、なんか嫌だ。

 

さんざんポケモンなどの乱数調整で「うひょー色違いの最高個体値げっとだぜー」とか昔やってたのに、Randomでハマるとはかなり恥ずかしい。

 

ちなみにポケモンエメラルド

Random random = new Random(起動してから経過した時間); 

である。これはひどい

 

個人的に、擬似乱数擬似乱数っていうけど、

「まぁつまるところデタラメに選ばれている数なんだろ」

と思っていたけれど、

それはどうやら違ったようです。

擬似乱数っていうのは、

「人間にはそれがデタラメに選ばれているように見えるけど、実はある規則に沿って並んでいる数列」

っていうのが擬似乱数らしいです。

で、高精度の疑似乱数は、実世界の乱数よりも高精度らしい。

なんじゃそりゃ。神越えとるやん。

 

素数はランダムに出現するよ!!!!」っていうけど、

素数にも「自分と1以外で割り切れない」っていう規則が一応ある。

むずかしいことはしらん。

 

ちなみに人間が作ったパスワードは、

コンピュータがランダムに作ったパスワードよりも遥かに精度が低いことが知られています。

無線LANのWPA/WPA2-PSKを総当たりで突破する「Pyrit」の実際の解析速度と自衛手段について - GIGAZINE

 

規則を知らないのにランダムな数を作るって、

なんか、労務系の法律知らん人が、会社の労働規約作ってる感あってつらい感ある。