JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptで数値を合計が一致する4つの乱数に分割する方法

要件

JavaScriptで、第1引数に合計値となる数値、第2引数に各要素の上限となる最大値を受け取る関数を作成することを考えます。

この関数は4つの乱数を生成し、その合計が第1引数で渡された数値とちょうど一致し、かつ4つのうちどの数値も第2引数で指定された最大値を超えないようにする必要があります。

たとえば、関数に渡す引数が次のような場合を想定してみましょう。

const n = 10;
const max = 4;

このとき、出力として

const output = [3, 2, 3, 2];

は有効な組み合わせです。3 + 2 + 3 + 2 = 10 となり、各要素は最大値の4を超えていません。

なお、同じ数値が複数回現れても構いません(重複は許容されます)。

実装コード

この問題を解くためのコードは以下の通りです。

const total = 10;
const max = 4;
const fillWithRandom = (max, total, len = 4) => {
    let arr = new Array(len);
    let sum = 0;
    do {
        for (let i = 0; i < len; i++) {
            arr[i] = Math.random();
        }
        sum = arr.reduce((acc, val) => acc + val, 0);
        const scale = (total - len) / sum;
        arr = arr.map(val => Math.min(max, Math.round(val * scale) + 1));
        sum = arr.reduce((acc, val) => acc + val, 0);
    } while (sum - total);
    return arr;
};
console.log(fillWithRandom(max, total));

アルゴリズムの仕組み

このコードの処理の流れを簡単に解説します。

  • まず、Math.random() を使って配列の各要素に0以上1未満の乱数を格納します。
  • 乱数の合計を求め、(total - len) / sum という係数で全体をスケーリングすることで、合計が目標値に近づくように調整します。
  • 各要素に1を加算して整数に丸めつつ、Math.min(max, ...) によって最大値を超えないようクランプします。
  • 最終的な合計が目標値と一致しなかった場合は、do...while ループによって条件を満たすまで再試行されます。

出力結果

コンソールには次のように出力されます。

[ 3, 3, 2, 2 ]

注意: Math.random() を使用しているため、実行するたびに出力される組み合わせは毎回異なります。

  1. JavaScriptのsplit()を使って数値の全桁を2乗し連結する方法

    本記事では、数値を引数として受け取り、その各桁を2乗して連結した新しい数値を返すJavaScript関数の作成方法を解説します。問題の概要作成する関数は、数値を最初かつ唯一の引数として受け取ります。そして、その数値のすべての桁をそれぞれ2乗し、結果を順番に連結して新しい数値として返す必要があります。例を見てみましょう。入力される数値が以下の場合:const num = 12349;期待される出力は次のとおりです:const output = 1491681;これは各桁の2乗である「1」「4」「9」「16」「81」を順に連結した結果です。1 + 4 + 9 + 16 + 81 = 1491681

  2. Pythonで乱数を生成する方法|randomモジュールの主要関数を解説

    Pythonには乱数を生成するための関数がいくつか用意されています。これらの関数は、ゲームや抽選など、ランダムな数値が必要となるさまざまな場面で活用できます。乱数を使うには、まず random モジュールをインポートする必要があります。import random以下に、代表的な乱数生成関数を紹介します。choice() – リストから1つの要素をランダムに選択choice() 関数は、数値のコレクション(リストなど)から1つの要素をランダムに選んで返します。サンプルコードprint (リストから選ばれた乱数 : ,end=) print (random.choice([1, 4, 6, 10