2014-03-28 49 views
6

如何生成一个9位数的整数,其中的所有数字都是1-9?像123456798,981234765,342165978等用1-9的所有数字生成随机整数

这样做:

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

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


111111119是不可接受的,因为每个号码中必须至少有一个“1”,“2”,“3”,...和“9”。

+0

那么对于初学者更改分钟111111111 – Banana

+5

这不是真正随机的,是什么呢? – CodingIntrigue

回答

4

这个程序描述的,小的调整随机混合的话,会是一个很好的补充您的自定义工具带。

改编自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

+0

从技术上讲,我不认为这是费希尔 - 耶茨,因为这并没有适当的洗牌。 – Peter

+0

@彼得你是对的,我现在更新了答案,请检查:) – thefourtheye

1

递归!

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