【问题标题】:Generate a random 4 digit number with no repeating digits生成一个没有重复数字的随机 4 位数字
【发布时间】:2021-10-23 10:29:16
【问题描述】:

我有这个函数来创建一个随机的 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”

有没有有效的方法来做到这一点?

【问题讨论】:

标签: javascript math random


【解决方案1】:

您可以使用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() );

【讨论】:

  • 这个方便的随机播放功能可能不那么难看:)
  • 注意不要以0开头
  • @apendua 是的,但是还有很多其他方法可以做到这一点,我不想专注于这个,因为它只是一个工具,问题不是问如何 i> 洗牌一个数组;)谢谢,顺便说一句
【解决方案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('');

【讨论】:

  • 很好,既然我已经看到了这个,我的方法就过于复杂了。
【解决方案3】:

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

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("");        
}

【讨论】:

    【解决方案4】:

    作为更新,试试这个...

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

    【讨论】:

      【解决方案5】:

      如果您可以将 0 作为第一个数字,这将是可行的:

      var getNum = () => randoSequence(0, 9).slice(-4).join("");
      
      console.log(getNum());
      &lt;script src="https://randojs.com/1.0.0.js"&gt;&lt;/script&gt;

      这将在没有 0 作为第一个数字的情况下进行:

      function getNum(){
        var sequenece = randoSequence(0, 9).slice(-4);
        return (sequenece[6] ? sequenece.slice(-4) : sequenece.slice(0, 4)).join("");
      }
      
      console.log(getNum());
      &lt;script src="https://randojs.com/1.0.0.js"&gt;&lt;/script&gt;

      这两个代码都使用rando.js 来简化随机性并使其更具可读性,因此如果您想使用其中任何一个,请不要忘记将脚本标记添加到 HTML 文档的头部。

      【讨论】:

        猜你喜欢
        • 2017-07-14
        • 1970-01-01
        • 1970-01-01
        • 2017-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-21
        相关资源
        最近更新 更多