JavaScriptでくじ引きプログラムを確率設定付きで正しく作る方法

randomでくじ引きプログラム

JavaScriptではMath.random()を使用すれば0以上1未満の範囲で浮動小数点の擬似乱数を返すことができるので、サイコロやおみくじのプログラム作成によく使用される。

// サイコロのプログラム例
const num = Math.floor(Math.random() * 6) + 1
console.log(num)
// 1から6の値をランダムで表示
// おみくじのプログラム例
const num = Math.floor(Math.random() * 3)
const kuji = ['大吉', '吉', '大凶'][num]
console.log(kuji)
// 大吉, 吉, 大凶をランダムで表示

1等などがあるくじ引きの作成方法

1等, 2等, 3等, はずれがある「くじ引き」のプログラム作成の場合はrandomだけで作成できない。

なぜなら1等, 2等, 3等, はずれを引き当てる確率はそれぞれ異なるからだ。

このような基本的なことを理解していない現役エンジニアがプログラムを解説しているWebサイトには注意が必要である。

それで作り方なのだが、オブジェクト変数のkeyに1等, 2等, 3等, はずれ、valueに確率が入ったものを以下のように用意する。

const data = {
  '1等': 10,  // 10%
  '2等': 20,  // 20%
  '3等': 30, // 30%
  // はずれ 40%
}

確率の数値は降順(小さい数値順)で入力してください。

次にrandomで1から100を返す処理を書きます。

const rand = Math.floor(Math.random() * 100)

あとは1から100の結果(rand変数)により1等, 2等, 3等, はずれのいずれかを返す処理をfor - in文で書けば1等や2等などを設定した確率で表示表示させることができる。

function lot() {
  const data = {
    '1等': 10,  // 10%
    '2等': 20,  // 20%
    '3等': 30, // 30%
    // はずれ 40%
  }
  const rand = Math.floor(Math.random() * 100)
  let result = 'はずれ'
  let rate = 0
  for (const prop in data) {
    rate += data[prop]
    if (rand <= rate) {
      result = prop
      break
    }
  }
  return result
  // 1等や2等などを設定した確率で表示
}

JavaScriptくじ引きプログラム確率設定付きサンプル

ユーザーには設定した確率を非表示

前述のコードはJavaScriptで書かれているためユーザーがコードを確認すれば設定した確率を見ることができる。

しかし、こちら側で設定した確率をユーザーに見せたくないケースもある。

その場合は確率の1から100を返す処理をPHPなどのサーバサイドプログラムで処理するか、Firebase Cloud FunctionsでJavaScriptの処理を記述して1から100の結果を受け取れば良い。(次回の記事で解説)