22

2 つの数値の間で乱数を生成する乱数ジェネレーターを作成しようとしています。たとえば、4 から 10 の間の乱数を生成したいとしましょう。4 から 10 までの任意の数から選択できるようにしたいと思います。これが私が試したことです。

var randNumMin = 4;
var randNumMax = 10;
var randInt = (Math.floor(Math.random() * (randNumMax - randNumMin + 1)) + randNumMin);

しかし、それは機能していないようで、4 から 10 の間ではない奇妙な乱数を生成し、一部は 0 で始まりました。これを行うための正しいアルゴリズムは何でしょうか?

アルゴリズムを実装しているコードは次のとおりです。

$(function() {
    $('#generateRandNums').click(function() {

        var numCount = document.getElementById("randNumCount").value;
        var randNumMin = document.getElementById("randNumMin").value;
        var randNumMax = document.getElementById("randNumMax").value;

        if (numCount.match(/^[\d]*$/ ) && randNumMin.match(/^[\d]*$/ ) && randNumMax.match(/^[\d]*$/ )) {       
            if (numCount == "" || randNumMin == "" || randNumMax == "")  {
                alert ("Please fill out all forms then try again.");

            } else {
                if (randNumMin>randNumMax) {
                    alert ("Please make sure your first number is smaller than the second, then try again.");
                } else {
                    if (randNumMin<0) {
                        alert ("Please make sure that you generate a positive number of random numbers, then try again.");
                    } else {

                        if (numCount>1) {
                            var randResult = ("You generated " + numCount + " random numbers between " + randNumMin + " and " + randNumMax + " and got the numbers ")
                            oneNumber = 0;
                        } else {
                            var randResult = ("You generated a random number between " + randNumMin + " and " + randNumMax + " and got the number ");
                            oneNumber = 1;
                        }
                        for (i=0;i<numCount;i++) {
                        //Get a random number between randNumMin and randNumMax
                        var randInt = (Math.floor(Math.random() * (randNumMax - randNumMin + 1)) + randNumMin);
                            if (i == numCount-1) {
                                if (oneNumber == 0) {
                                    randResult = (randResult + "and " + randInt + ".");
                                } else {
                                    randResult = (randResult + randInt + ".");
                                }
                            } else {
                                randResult = (randResult + randInt + ", ");
                            }
                        }
                        $("#randNumResults").val(randResult);
                    }
                }
            }
        } else {
            alert ("Make sure you only enter numbers and no spaces, then try again.");
        }

    });
});

また、 randInt 行を次のように置き換えてみました。

var randInt = Math.floor((Math.random() * ((randNumMax + 1) - randNumMin)) + randNumMin);

それでもうまくいきませんでした。アルゴリズムが間違っているのか、関数に間違って組み込んでいるのかわからない。回答をいただければ幸いです。

4

5 に答える 5

57

特定の範囲でJavaScriptでランダムな整数を生成しますか?

/**
 * Returns a random number between min and max
 */
function getRandomArbitary (min, max) {
    return Math.random() * (max - min) + min;
}

/**
 * Returns a random integer between min and max
 * Using Math.round() will give you a non-uniform distribution!
 */
function getRandomInt (min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
}

http://roshanbh.com.np/2008/09/get-random-number-range-two-numbers-javascript.html

//function to get random number upto m
function randomXToY(minVal,maxVal,floatVal)
{
    var randVal = minVal+(Math.random()*(maxVal-minVal));
    return typeof floatVal=='undefined'?Math.round(randVal):randVal.toFixed(floatVal);
}

また

JavaScript で 2 つの数値の間に乱数を生成する

于 2012-04-13T01:46:06.213 に答える
2

Underscore.jsには、この _.random(min,max) の便利なユーティリティがあります。

于 2014-04-07T20:46:48.693 に答える
2

あなたの問題は、文字列を数値に変換したことがないことです。これを追加してみてください

if (  numCount.match(/^[\d]*$/ ) && 
    randNumMin.match(/^[\d]*$/ ) && 
    randNumMax.match(/^[\d]*$/ )){
  if (numCount === "" || randNumMin === "" || randNumMax === "")  {
    alert ("Please fill out all forms then try again.");
  } else {
    numCount=numCount-0;randNumMin=randNumMin-0;randNumMax=randNumMax-0;

値が空の文字列であるかどうかのチェックを厳密な等価に変更する必要があることに注意してください。私が何を意味するかを理解するには、値の 1 つにゼロを使用してみてください。0 == ""//returns trueどちらも偽物だから0 === ""//returns falseです。

于 2012-04-13T02:59:40.500 に答える
1

これはどう?

var max = 10;
var min = 4;
var random = Math.floor((Math.random() * ((max + 1) - min)) + min);
于 2012-04-13T01:52:26.220 に答える