javascript - 随机数,不等于前一个数

标签 javascript

我需要获取随机数,但它不应该等于之前的数字。这是我的一段代码。但这不起作用。

function getNumber(){
  var min = 0;
  var max = 4;
  var i;
  i = Math.floor(Math.random() * (max - min)) + min;
  if (i=== i) {
    i = Math.floor(Math.random() * (max - min)) + min;
  }
  return i;
};

console.log(getNumber());

最佳答案

这个答案提出了三种尝试

  1. 一个简单版本,具有函数 getNumberlast 的属性,用于存储最后一个随机值。

  2. 该版本对 minmax 值使用闭包,如果 max 小于 则引发异常>分钟

  3. 结合了闭包和保留所有随机值并在适当时使用它的想法的版本。

<小时/>

一个

您可以使用 getNumber 的属性来存储最后一个数字并使用 do ... while 循环。

function getNumber() {
    var min = 0,
        max = 4,
        random;

    do {
        random = Math.floor(Math.random() * (max - min)) + min;
    } while (random === getNumber.last);
    getNumber.last = random;
    return random;
};

var i;
for (i = 0; i < 100; i++) {
    console.log(getNumber());
}
.as-console-wrapper { max-height: 100% !important; top: 0; }

<小时/>

两个

另一个提案,其中包含区间和最后一个随机值的闭包。

function setRandomInterval(min, max) {
    var last;
    if (min >= max) {
        throw 'Selected interval [' + min + ', ' + max + ') does not work for random numbers.';
    }
    return function () {
        var random;
        do {
            random = Math.floor(Math.random() * (max - min)) + min;
        } while (random === last);
        last = random;
        return random;
    };
}

var i,
    getRandom = setRandomInterval(0, 4);

for (i = 0; i < 100; i++) {
    console.log(getRandom());
}

setRandomInterval(4, 4); // throw error
.as-console-wrapper { max-height: 100% !important; top: 0; }

<小时/>

该提案使用的想法是最大限度地减少新随机数的调用。它使用两个变量,value 用于连续相同的随机值,count 用于保存相同值的计数。

如果给定了保存的计数并且该值不等于最后一个值,则该函数首先查找。如果发生这种情况,则返回保存的值并减少计数。

否则,将生成新的随机数并按上述方式进行检查(第一个提议)。如果该数字等于最后一个值,则计数会增加,并继续生成新的随机值。

因此,几乎所有先前生成的随机值都被使用。

function setRandomInterval(min, max) {
    var last,      // keeping the last random value
        value,     // value which is repeated selected
        count = 0, // count of repeated value
        getR = function () { return Math.floor(Math.random() * (max - min)) + min; };

    if (min >= max) {
        throw 'Selected interval [' + min + ', ' + max + ') does not work for random numbers.';
    }
    return function () {
        var random;
        if (count && value !== last) {
            --count;
            return last = value;
        }
        random = getR();
        while (random === last) {
            value = random;
            ++count;
            random = getR();
        }
        return last = random;
    };
}

var i,
    getRandom = setRandomInterval(0, 4);

for (i = 0; i < 100; i++) {
    console.log(getRandom());
}
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 随机数,不等于前一个数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40056297/

相关文章:

javascript - 部署 firebase 时出现解析错误

php - 如何使用 Ajax for MYSQL 插入、编辑、删除、显示条目?

javascript - 列出数据以及单击数据时移动的 map

javascript - 有没有在 node.js 中做实时模型的框架?

javascript - JS : remove duplicate values in array, 包括原文

javascript - 如何在javascript中将带连接的字符串转换为真实字符串?

Javascript从表单输入计算输入数字

ASP.NET 按钮回发后的 Javascript 重定向

javascript 根据表单输入将用户重定向到目录

javascript - 无法使用饼图 Highcharts 显示结果