解決済み:複数の変数から最小値を求めたいです。

mudai

ユーザー
質問失礼します。
現在20個の変数の中から最小のモノを探し出す手段として

var a = [$gameVariables.value(381), $gameVariables.value(382), $gameVariables.value(383)
, $gameVariables.value(384), $gameVariables.value(385), $gameVariables.value(386)
, $gameVariables.value(387), $gameVariables.value(388), $gameVariables.value(389)
, $gameVariables.value(390), $gameVariables.value(391), $gameVariables.value(392)
, $gameVariables.value(393), $gameVariables.value(394), $gameVariables.value(395)
, $gameVariables.value(396), $gameVariables.value(397), $gameVariables.value(398)
, $gameVariables.value(399), $gameVariables.value(400)];
var min = Math.min.apply(null, a);
$gameVariables.setValue(11, min)


検索して出て来たMath.minでやってみたんですがこのやり方だと求めた瞬間処理が重くなる?
一瞬フリーズしてしまうのでもっと効率の良い、フリーズしないやり方をご存じの方が居ましたらどうか教えて頂きたいです。
 

ジェミニ

ユーザー
こんばんは。
「解決済み」と書かれていますが一応いい感じの計算方法を書いておきます。
もっとも、処理が重くなる理由はよくわかりません...。

// 変数のIDリスト(ids)を作成。連番(from=381~to=400)なので一気に作ってしまう。
const from = 381;
const to = 400;
const ids = Array(to - from + 1)
.fill()
.map((_, i) => i + from);
// 変数のIDリストから、変数の値リスト(values)を作成。
const values = ids.map((id) => $gameVariables.value(id));
// 変数の値リストの中で最小の値を求め、変数11番に代入。
const min = Math.min(...values);
$gameVariables.setValue(11, min);
 
変数が381番から400番までって必ず決まっているのなら
コード:
let min = $gameVariables.value(381);
for (let i = 382; i <= 400; i++) {
    if (min > $gameVariables.value(i)) {
        min = $gameVariables.value(i);
    }
}
$gameVariables.setValue(11, min);
でいいかも(Math.minを呼ばないぶん少しは時間が減る)
 

mudai

ユーザー

ジェミニ様、降間_MZで制作中様 返答ありがとうございます。

ジェミニ様​

const from = 381;
const to = 400;
const ids = Array(to - from + 1)
.fill()
.map((_, i) => i + from);
// 変数のIDリストから、変数の値リスト(values)を作成。
const values = ids.map((id) => $gameVariables.value(id));
// 変数の値リストの中で最小の値を求め、変数11番に代入。
const min = Math.min(...values);
$gameVariables.setValue(11, min);

とあるのですが
const from = 381;
const to = 400;
この箇所で変数を指定していると思って大丈夫でしょうか?なら381と400の場所を変えれば指定変数が変わるのでしょうか?

降間_MZで制作中様​

let min = $gameVariables.value(381);
for (let i = 382; i <= 400; i++) {
if (min > $gameVariables.value(i)) {
min = $gameVariables.value(i);
}
}
$gameVariables.setValue(11, min);

とあるのですが
for (let i = 382; i <= 400; i++) {
とここは何故1多い382と1低い400なのでしょうか?

そしてすみません解決済みとした理由なのですが計算によって重くなっているのではなく、
計算後に別の処理をしていてそちらが重くなっていたみたいです。
 
let min = $gameVariables.value(381);
まず,minに初期値として変数381番の値を入れています。minには後で変数381~400番の範囲の最小値が入ります。

for (let i = 382; i <= 400; i++) {
変数382番から変数400番までを順に参照するためにiを382から初めて400まで1ずつふやしていきます
( i “<=” 400)なので400のときも条件が成立しforループ内が実行される)
変数381は既にminに入っている(プログラム中で参照している)ので,382から始めています。

if (min > $gameVariables.value(i)) {
min = $gameVariables.value(i);
}
 minより$gameVariables.value(i)が小さければ,いまのminよりも小さい値が
 変数382~400番の中で見つかったので,その変数の値をminに入れることで最小値を更新します。
 例えばi=382のとき min と $gameVariables.value(i)=$gameVariables.value(382) が比較されます。
 
トップ