投稿 2023年3月26日
更新 2023年3月26日
専門用語の数:多
「ランダム」とは
日本語で言う無作為。
一般的には、規則性がなく予測が不可能なことを指します。
いわゆる「適当に」ってやつですね。
身近に使用している場面はあるかと思いますが、
今回はソシャゲでよく見る「ガチャ」を例にあげてみます。
提供確率で、キャラごとにn%…
みたいな表記がずらっと書かれているかと思います。
本当に確率通りになるのか?
と、一度は考えたことがあるのではないでしょうか。
今回はその「ランダム」について、語っていきます。
例にあげたガチャは本当にランダムなのか?
一概には言えませんが、ランダムとは言えないものも存在しています。
※対策をしているものもあるかと思います
そもそも誰が、ランダムなキャラを選んでいるのかと言うと、
最終的には機械(パソコン)が、ランダムな値を求めています。
例のガチャでいうと、ざっくり以下のような流れです。
よく考えてみると、機械がランダム、
いわゆる適当に値を出すことは出来るのか?
機械って言うと必ず同じ動きをする…
と言うか、同じ動きじゃないと困るものですよね。
その機械に「適当に」と言っても、難しい話なのです。
ここまで説明すると、なんとなく分かるかもしれませんが、
ちゃんと数式によって値を求めています。
つまり理論上、再現することができます。
ただ、その値を人間が見たら、ランダムだと思えるような数式になっています
それを「疑似ランダム関数」と呼びます。
その関数を使用するには、シード(Seed)値と呼ばれる値を渡してあげる必要があります。
指定せず実行するとプログラム側で
現在時刻だったりプロセスIDだったりと、
特定されにくい値を自動的にシード値として使用します。
本題の確率通りに出現するのか?
実は疑似ランダム関数だと、規則性がある数式を使用する関係上
どうしてもかたよってしまいます。
Javaでランダムを実行してみました。
実行結果がこちらです。
出現値 : 出現回数/検証回数
0 : 95/1000
1 : 104/1000
2 : 98/1000
3 : 121/1000
4 : 91/1000
5 : 117/1000
6 : 94/1000
7 : 68/1000
8 : 104/1000
9 : 108/1000
かたよってますね…
何度か実行してみます。
出現値 : 出現回数/検証回数
0 : 89/1000
1 : 97/1000
2 : 79/1000
3 : 102/1000
4 : 108/1000
5 : 114/1000
6 : 110/1000
7 : 94/1000
8 : 96/1000
9 : 111/1000
出現値 : 出現回数/検証回数
0 : 97/1000
1 : 87/1000
2 : 106/1000
3 : 93/1000
4 : 93/1000
5 : 106/1000
6 : 125/1000
7 : 82/1000
8 : 102/1000
9 : 109/1000
出現値 : 出現回数/検証回数
0 : 89/1000
1 : 89/1000
2 : 110/1000
3 : 86/1000
4 : 111/1000
5 : 104/1000
6 : 105/1000
7 : 108/1000
8 : 106/1000
9 : 92/1000
出現値 : 出現回数/検証回数
0 : 88/1000
1 : 107/1000
2 : 116/1000
3 : 109/1000
4 : 104/1000
5 : 88/1000
6 : 97/1000
7 : 105/1000
8 : 107/1000
9 : 79/1000
出現値 : 出現回数/検証回数
0 : 106/1000
1 : 90/1000
2 : 112/1000
3 : 92/1000
4 : 98/1000
5 : 109/1000
6 : 103/1000
7 : 107/1000
8 : 94/1000
9 : 89/1000
Javaには「SecureRandom」という、
より品質の高いランダムを生成するクラスが存在します。
簡単なランダムなら問題はないですが、
セキュリティに関係する大事なところでは、こういうランダムを使用しましょう。
どうでしたか?
言語によっても数式やシード値、アルゴリズムが変わるため、
かたよりにも誤差はありますが、まさか確立通りでないとは…
みなさんがランダムだと思っていたものが、実はランダムではないかも知れない
そう思うと、見る世界が変わるかもしれませんね。
以上、ここまで見ていただきありがとうございます。
皆さまの快適な開発ライフに、ほんの少しでもお役に立てれば幸いです。
コメント一覧