Javascript - 生成一个没有重复数字的randome 4位数字

时间:2015-08-19 20:22:22

标签: javascript math random

我有这个功能来创建一个随机的4位数字

    generateCode = function(){
      var fullNumber = [];
      var digit1 = Math.floor(Math.random() * 9) + 1;
      var digit2 = Math.floor(Math.random() * 9) + 1;
      var digit3 = Math.floor(Math.random() * 9) + 1;
      var digit4 = Math.floor(Math.random() * 9) + 1;
      fullNumber.push(digit1, digit2, digit3, digit4);
      this.theCode(fullNumber.join("")) ;
    }

但我需要创建一个没有重复数字的4位数随机数。 所以“1234”或“9673”......但不是“1145”或“5668”

任何帮助都非常感谢!不确定以有效的方式来到这个

5 个答案:

答案 0 :(得分:5)

您可以使用this handy shuffle函数来混洗包含数字的数组,并选择前4个。

function random4Digit(){
  return shuffle( "0123456789".split('') ).join('').substring(0,4);
}

function shuffle(o){
    for(var j, x, i = o.length; i; j = Math.floor(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
    return o;
}

alert( random4Digit() );

修改:如果您确实想要一个不以0开头的数字:

function random4DigitNumberNotStartingWithZero(){
    // I did not include the zero, for the first digit
    var digits = "123456789".split(''),
        first = shuffle(digits).pop();
    // Add "0" to the array
    digits.push('0');
    return parseInt( first + shuffle(digits).join('').substring(0,3), 10);
}

function shuffle(o){
    for(var j, x, i = o.length; i; j = Math.floor(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
    return o;
}

alert( random4DigitNumberNotStartingWithZero() );

答案 1 :(得分:2)

创建一个数字数组,将其随机化,然后切出前4个并将它们连接在一起。

var numbers = [0,1,2,3,4,5,6,7,8,9];

function shuffleArray(array) {
    for (var i = array.length - 1; i > 0; i--) {
        var j = Math.floor(Math.random() * (i + 1));
        var temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
    return array;
}

shuffleArray(numbers).slice(0,4).join('');

答案 2 :(得分:0)

这实际上取决于你如何处理这个问题。一种解决方案是将已经使用过的数字存储在数组中,然后在生成数字时搜索数组。如果生成的数字包含在数组中,那么您尝试生成另一个数字。如果您有一些不同的功能,那么执行这样的几个不同的步骤也更容易理解。请参阅下面的示例:

var checkRandomUsed = function(array, number){
    return array.indexOf(number) > -1;
}
var getCheckedRandom = function(array){
    var random = getRandomNum();
    while (checkRandomUsed(array, random)){
        random = getRandomNum();
    }
    return random;
}
var getRandomNum = function(){
    return Math.floor(Math.random() * 9) + 1;
}
var generateCode = function(){
    var usedNumbers = [];
    for (var i = 0; i < 4; i++){
        usedNumbers.push(getCheckedRandom(usedNumbers));
    }
    return usedNumbers.join("");        
}

答案 3 :(得分:0)

作为更新,请尝试...

const value = (new Array(4))
  .map(() => (Math.floor(Math.random() * 9) + 1).toString()).reduce((p, c) => p + c);

答案 4 :(得分:0)

如果可以的话,可以用0作为第一位数字来完成此操作:

var getNum = () => randoSequence(0, 9).slice(-4).join("");

console.log(getNum());
<script src="https://randojs.com/1.0.0.js"></script>

这将使第一位数字不为0:

function getNum(){
  var sequenece = randoSequence(0, 9).slice(-4);
  return (sequenece[6] ? sequenece.slice(-4) : sequenece.slice(0, 4)).join("");
}

console.log(getNum());
<script src="https://randojs.com/1.0.0.js"></script>

这两个代码都使用rando.js来简化随机性并使其更具可读性,因此,如果要使用它们中的任何一个,请不要忘记将script标签添加到HTML文档的开头。 / p>

相关问题