【问题标题】:Javascript Random Integer Between two Numbers两个数字之间的Javascript随机整数
【发布时间】:2012-04-25 10:16:57
【问题描述】:

我正在尝试创建一个在两个数字之间生成随机数的随机数生成器。例如,假设我想生成一个介于 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);

还是不行。 我不确定算法是否错误,或者我将其错误地合并到函数中。感谢您的回答,谢谢。

【问题讨论】:

标签: javascript random


【解决方案1】:

Generating random whole numbers in JavaScript in a specific range?

/**
 * 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);
}

Generate random number between two numbers in JavaScript

【讨论】:

  • 我尝试了问题中函数的链接中的方程式,但它不起作用。
  • 不确定您是否看到我更新的答案,但现在有多个来源。第一个链接/代码应该来自 Mozilla 开发者中心。
  • 我感觉问题还在于您没有将字符串转换为整数。但是由于操作的顺序,可以通过使用我上面提供的 getRandomInt() 函数来避免这种情况。由于它在添加“1”之前完成了“max - min”,因此结果是一个 int(只要 max 和 min 是有效数字)......那么其余的计算作为整数完成并且应该是准确的。跨度>
  • 对不起,我看不懂上面的代码。我对javascript相当陌生。你能解释一下把它转换成整数的过程对我来说更简单吗?
  • “+”运算符对字符串和整数的作用不同。当您使用“str”+“str”时,它会将它们连接起来,在技术上将它们组合成“strstr”。当您使用 int + int 时,它会以数学方式添加它们。当您使用 "str" + int 或 int + "str" 时,它会将它们连接为字符串,因为至少有一个参数是字符串。如果要添加字符串和 int,则必须 parseInt(Int)。当您使用“-”运算符时,行为是减去数字。似乎默认情况下,Jscript 尝试将所有参数转换为数字,如果失败,则产生 NaN,否则产生结果。
【解决方案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;

另一个注意事项,您需要将检查值是否为空字符串更改为严格相等。要了解我的意思,请尝试对其中一个值使用零。 0 == ""//returns true 因为两者都是假的 0 === ""//returns false

【讨论】:

  • 你知道为什么我的“请确保第一个数字小于第二个数字”当我将第一个数字设为零时不起作用吗?
  • @JackDavis 我不确定出了什么问题,因为它似乎对我来说工作正常。这是我所拥有的jsfiddle.net/YLxPr.
  • 没关系,我只需要在所有 if 之前转换为整数。另外,为什么它们一开始就不是整数?
  • @JackDavis 您从输入框中获取它们,这意味着它们是字符串,因此您必须将它们转换为数字。
【解决方案3】:

Underscore.js 对此 _.random(min,max) 有一个很好的实用程序

【讨论】:

    【解决方案4】:

    这个怎么样?

    var max = 10;
    var min = 4;
    var random = Math.floor((Math.random() * ((max + 1) - min)) + min);
    

    【讨论】:

    • 我在我在问题中发布的函数中实现了这一点,但它似乎仍然无法正常工作,并且给了我很大的数字。
    • 我重读了你的问题,这段代码基本上和你得到的一样——只是为了可读性增加了一些额外的括号。不要认为问题出在随机生成器上。
    • 对,我是从其他 cmets 那里了解到的。就是我没有转换成整数。
    【解决方案5】:

    randojs.com 使它成为一个简单的单行:

    rando(4, 10)
    

    您只需将其添加到您的 html 文档的头部,您就可以轻松地随心所欲地做任何您想做的事情。来自数组的随机值、随机的 jquery 元素、来自对象的随机属性,甚至在需要时防止重复。

    <script src="https://randojs.com/1.0.0.js"></script>
    

    【讨论】:

      猜你喜欢
      • 2014-10-02
      • 2022-01-18
      • 2015-02-12
      • 1970-01-01
      • 2018-09-18
      • 1970-01-01
      • 2013-10-14
      相关资源
      最近更新 更多