【问题标题】:Generate random integer with ALL digits from 1-9生成所有数字从 1-9 的随机整数
【发布时间】:2014-03-28 08:21:23
【问题描述】:

如何生成一个包含 1-9 的所有数字的 9 位整数?比如123456798、981234765、342165978等

这样做:

var min = 100000000;
var max = 999999999;
var num = Math.floor(Math.random() * (max - min + 1)) + min;

不工作给我大部分时间我想要的整数(没有从 1 到 9 的所有数字)。


111111119 是不可接受的,因为每个数字中必须至少有一个“1”、“2”、“3”……和一个“9”。

【问题讨论】:

  • 首先将最小值更改为 111111111
  • 这不是随机的,是吗?

标签: javascript


【解决方案1】:

只需从字符串123456789 开始,然后按照How do I shuffle the characters in a string in JavaScript? 中的描述随机打乱它

String.prototype.shuffle = function () {
    var a = this.split(""),
        n = a.length;

    for(var i = n - 1; i > 0; i--) {
        var j = Math.floor(Math.random() * (i + 1));
        var tmp = a[i];
        a[i] = a[j];
        a[j] = tmp;
    }
    return a.join("");
}

【讨论】:

    【解决方案2】:

    这个程序稍加调整,将成为您自定义实用腰带的一个很好的补充。

    改编自Underscore.js 库的_.shuffle 函数,该函数使用Fisher-Yates Shuffle algorithm 打乱数据列表。

    function getRandomNumber() {
        var rand, index = 0, shuffled = [1, 2, 3, 4, 5, 6, 7, 8, 9];
    
        shuffled.forEach(function(value) {
            rand = Math.floor(Math.random() * ++index);
            shuffled[index - 1] = shuffled[rand];
            shuffled[rand] = value;
        });
    
        return shuffled.reduce(function(result, current) {
            return result * 10 + current;
        }, 0);
    }
    
    console.log(getRandomNumber());
    

    此程序将始终返回一个包含所有 9 个数字且长度也是 9 的数字。

    【讨论】:

    • 从技术上讲,我认为这不是 Fisher-Yates,因为这并没有就地洗牌。
    • @Peter 你是对的,我现在更新了答案,请检查:)
    【解决方案3】:

    递归!

    var randomize = function (str) {
        if (str.length == 9) return str;
        var newDigit = Math.floor(Math.random()*9 + 1);
        if (str.indexOf(newDigit) == -1) {
            return randomize(str + newDigit);
        } else {
            return randomize(str);
        }
    }
    

    那里有很大的优化空间。或者只是使用一个简单的循环。

    Working fiddle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      • 2018-04-16
      • 1970-01-01
      • 1970-01-01
      • 2018-10-09
      • 2014-08-22
      • 1970-01-01
      相关资源
      最近更新 更多