0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

JavaScriptで配列からランダムな数字を生成する

Posted at

以前、女神転生の「コードブレイカー」をRubyで再現したことがあるが、
それをブラウザで動かしてみたくなったのでJavaScriptでコーディングしてみようと考えた。

そこで、真っ先に躓いたのが、答えとなる数字の生成。

3桁の重複しない数字を生成するのに、
Rubyでは

# 抽出元の配列を生成
arr1 = (0..9).to_a

# 配列からランダムに3つを選択
ans1 = code.sample(3)

たったこれだけでいい。
便利なメソッドを開発者が用意してくれているお陰である。

しかし、JavaScriptには
「一定範囲の数値を配列化できるメソッド」も
「配列から指定した個数の要素をランダムに選ぶメソッド」も
存在しないのである。

だからどうした、無ければ作るまでだ、と、
検索と試行錯誤を繰り返した末、どうにかそれらしいものは作れた。
使う機会があるかわからないが、参考になれば幸いである。

抽出元の配列を作る

範囲オブジェクト((0..9)の部分)が使えないので、
地道に数字を手打ちして作った。

const arr1 = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];

作りながら、ふと
「これ、ビンゴゲームなんか作りたい時、どうするんだろうか」
と不安になったが、今は考えないことにする。

配列から指定した個数の要素をランダムに選ぶ

ランダムに選ぶメソッドがないので、
「乱数に抽出元の配列の長さをかけた数値を作る」
「Math.floor()関数で小数点以下を切り捨てて整数にする」
「出来た整数と同じインデックス(番地)の要素を選び、空の配列に加える」
「元の配列から選択された要素を削除する」
という流れで処理することにした。
この一連の処理を、配列の長さが3になるまで繰り返す。

let ans1 = [];
while(ans1.length < 3) {
    // 配列からランダムに選ぶ
    const rand = Math.floor(Math.random() * arr1.length);
    // 選んだ要素を答え用の配列に入れる
    ans1.push(arr1[rand]);
    // 元の配列からは消す(重複防止)
    arr1.splice(rand, 1);
    }
    return ans1;

乱数の所で配列の長さを掛けているのは、0~9の数字の数を掛けると、
2回目以降の選択では配列の長さが1ずつ減るので、
乱数が2回目に9、3回目に8か9になってしまうと、
存在しないインデックスを参照してしまうため。

最後のreturnは出来上がった配列を次の処理に渡すためのもの。

0
0
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?