是否有一种有效的方法可以将整数展开为随机的唯一数字?
我希望10
成为3 4 6 1 0 2 5 7 8 9
。
我尝试了THIS ...但是在将值推入数组并且循环疯狂之前我想也许有更好的方法。
修改
这是我的新FIDDLE和功能:
function uniqueDigits(x){
y = [];
z = [];
while(x > 0) {
y.push(x);
x--;
}
while(y.length > 0){
var r = Math.floor(Math.random()*y.length);
var u = y[r]
y.splice(r, 1);
z.push(u-1);
}
return z;
}
uniqueDigits(4) //['2', '3', '0', '1']
修改
此处是另一个OPTION:
function uniqueNum(x){
z = y = x;
var r = Math.ceil(Math.random() * x);
while ( x%r%2 == 0 ) {
r = Math.ceil(Math.random() * x);
}
while( x>0 ){
y = y - r
if(y<0){
var n = y;
y = z + n
}
$('p').append(y);
x--
}
} uniqueNum(4);//['2', '3', '0', '1']
或THIS一个
好的,我已经完成了。
答案 0 :(得分:3)
由于您要查找范围内的所有数字,请尝试
var x = 10,
array = [];
for (var y = 0; y < x; y++) {
array.push(y);
}
while (array.length) {
var random = Math.floor(Math.random() * array.length);
$('p').append(array.splice(random, 1));
}
演示:Fiddle
使用数组的另一种方法是
var x = 10,
array = [];
//used for counting the loop for performance testing - remove it
var counter = 0;
for (var y = 0; y < x;) {
var random = Math.floor(Math.random() * x);
if ($.inArray(random, array) == -1) {
$('p').append(random);
array.push(random);
y++;
}
//for test
counter++;
}
console.log(counter)
演示:Fiddle - 但循环执行次数
答案 1 :(得分:1)
为了提高效率,我会编写范围,然后将其改为使用
事实上无偏见的随机播放算法是Fisher-Yates(又名 Knuth)Shuffle。
来自How to randomize (shuffle) a javascript array?回答。
所以它会是:
var x = 10;
var range = [];
for (var y = 0; y < x; y++) {
range.push(y);
}
function shuffle(array) {
var currentIndex = array.length
, temporaryValue
, randomIndex
;
// While there remain elements to shuffle...
while (0 !== currentIndex) {
// Pick a remaining element...
randomIndex = Math.floor(Math.random() * currentIndex);
currentIndex -= 1;
// And swap it with the current element.
temporaryValue = array[currentIndex];
array[currentIndex] = array[randomIndex];
array[randomIndex] = temporaryValue;
}
}
shuffle(range);
答案 2 :(得分:0)
我会这样做:
function getRandomNonRepeatedInt(limit)
{
var array = [], result = "";
for (var y = 0; y <= limit-1; array.push(y), y++);
while (array.length) result = result + array.splice(Math.floor(Math.random() * array.length), 1)[0];
return result;
}
对于模糊处理感到抱歉......: - )