demilio
@demilio

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

2つの定数の比較

解決したいこと

質問が多くなってしまい申し訳ありません。
JavaScriptの勉強中です。
計算式(引き算)を練習で作っていてある疑問がわいてきました。

【小学校の算数】
最初の数字が2個目の数字より大きくないと答えが負の数になってしまいます。
負の数は小学校では習いませんよね。
ex)2-5=-3

そのため、完全に最初の数字が2個目の数字より大きくなるように設定(プログラミング)したいのですが、
可能なのでしょうか。

私は、比較演算子しか思い浮かばないのですが、
比較演算子は比較をしてtrueかfalseを返すものですよね。

if(q1>q2){
}
ではなく、
乱数の範囲を変えずに、完全にq1がq2より大きなるように設定したいです。

恐縮ですが、よろしくお願いいたします。

JavaScript

 function a() {
          const b = Math.random();

          // 確率
          if(b < 0.2) {
            // 小数第2位で四捨五入
            return Math.round((Math.random() * 1000 + 1) * 10 )/ 10;
          }else if(b < 0.4) {
            // 小数第3位で四捨五入
            return Math.round((Math.random() * 1000 + 1) * 100 )/ 100;
          }
          else {
            return Math.floor(Math.random() * 1000 + 1);
          }
        }

       

        const q1 = a();
        const q2 = a();

 document.getElementById("cal").innerHTML = `${q1}${q2}`;
        const correct = q1 - q2;
0

4Answer

ソートした結果を代入するのはいかが?

const [q2, q1] = [a(), a()].sort();
> [a(), a()]
[ 939, 633 ]
> [a(), a()]
[ 142, 281.5 ]
> [a(), a()].sort()
[ 131.09, 420 ]
> [a(), a()].sort()
[ 212, 60 ]
> [a(), a()].sort()
[ 286, 36 ]
> [a(), a()].sort()
[ 392.7, 49.6 ]
2Like

「乱数の範囲を変えずに」という条件ならば、メソッドaが返す結果はコントロール出来ないので、生成された数値の大小を比較することになります。
ifやソートがその方法です。

ifで大小比較
let q1 = a();
let q2 = a();

if (q1 < q2) {
    // q1とq2を入れ替え
    [q1, q2] = [q2, q1];
}

console.log(`${q1}${q2}`);

乱数の範囲を変えて良いなら、乱数の最小値や最大値を指定する方法があります。

例えば次の例は、引数min~100 99までの整数を生成するものです。
先にq2を生成し、q1はq2を最小とした整数を生成します。

function createRandomInt(min) {
    const max = 100; // max未満
    return Math.floor(Math.random() * (max - min) + min);
}

const q2 = createRandomInt(1); // 1~99の整数
const q1 = createRandomInt(q2); // q2~99の整数

1Like

Comments

  1. 回答を訂正しました。
    @think49さんが指摘された通り、最大はmax未満なので、正しい最大値は100ではなく99になります。

@demilio さん
「最小値」と「最大値」を指定して乱数生成するのが良いと思います。
「q1 - q2」の式において、下記条件が成立します。

  • q1 … q2 + 1 以上、1000以下
  • q2 … 1以上999以下

ご質問のコードにある「生成値の意図的な偏り」は省略しますが、簡易コードとしては以下のように書けます。

<p id="calc"></p>
<script>
  'use strict';
  {
    const generateNumber = (minNumber, maxNumber) => Math.floor(Math.random() * (maxNumber - minNumber + 1) + minNumber);
    const number2 = generateNumber(1, 999);
    const number1 = generateNumber(number2 + 1, 1000);
    document.getElementById('calc').textContent = number1 + ' - ' + number2;
  }
</script>
1Like

Comments

  1. すみません。
    よくみたら、最小値のコードは @blue32a さんが提案済みでした。

    ---

    @blue32a さんが書かれたコードですが、「最大値 = max - 1」になるようなので、ご注意ください。
    下記コードは100%の確率で「99」がコンソール出力されます。

    ```javascript
    function createRandomInt(min) {
    const max = 100;
    return Math.floor(Math.random() * (max - min) + min);
    }

    console.log(createRandomInt(99));
    ```

返信遅れました。
皆様のおかげで解決致しました。
コードの詳しい説明もしていただいて感謝しています。
個人的には少し難しくなっていきましたが、頑張ります。

1Like

Your answer might help someone💌