Javascript每次都会生成随机唯一编号

时间:2011-08-12 19:55:09

标签: javascript arrays

好的,所以我需要在1-10之间创建四个随机生成的数字,它们不能相同。所以我的想法是将每个数字添加到数组中,但是如何检查数字是否在数组中,如果是,则重新生成数字,如果不是将新数字添加到数组中?

所以基本上它会去,

1.创建新号码并添加到阵列 2.创建第二个新数字,检查它是否已存在,如果不存在,则添加到数组。如果确实存在,请重新创建新号码,再次检查等... 3.同上,等等。

7 个答案:

答案 0 :(得分:9)

你想要一个所谓的“随机抓包”。考虑一下你有一个“袋子”的数字,每个号码只在这个包中代表一次。你可以根据需要随机抽出数字。

这里介绍的一些其他解决方案的问题是它们随机生成数字,并检查它是否已被使用。这将花费更长的时间来完成(理论上可以达到无限的时间)因为你正在等待random()函数返回一个你还没有的值(并且它不会拥有

有很多方法可以实现抓包式解决方案,每种解决方案都有不同程度的成本(但是,如果正确完成,将永远不会无限)。

您问题的最基本解决方案如下:

var grabBag = [1,2,3,4,5,6,7,8,9,10];

// randomize order of elements with a sort function that randomly returns -1/0/1
grabBag.sort(function(xx,yy){ return Math.floor(Math.random() * 3) - 1; })

function getNextRandom(){
    return grabBag.shift();
};

var originalLength = grabBag.length;
for(var i = 0; i < originalLength .length; i++){
    console.log(getNextRandom());
}

这当然对原始的grabBag数组具有破坏性。而且我不确定那种“真正随机”是多少,但对于许多应用来说它可能“足够好”。

稍微不同的方法是将所有未使用的元素存储在数组中,随机选择一个索引,然后删除该索引处的元素。这里的成本是每次删除元素时创建/销毁数组的频率。

答案 1 :(得分:2)

使用数组查看是否已生成该数字。

var randomArr = [], trackingArr = [],
    targetCount = 4, currentCount = 0,
    min = 1, max = 10,
    rnd;

while (currentCount < targetCount) {
    rnd = Math.floor(Math.random() * (max - min + 1)) + min;
    if (!trackingArr[rnd]) {
        trackingArr[rnd] = rnd;
        randomArr[currentCount] = rnd;
        currentCount += 1;
    }
}

alert(randomArr); // Will contain four unique, random numbers between 1 and 10.

工作示例:http://jsfiddle.net/FishBasketGordo/J4Ly7/

答案 2 :(得分:2)

以下是使用Matt的grabBag技术的几个版本:

function getRandoms(numPicks) {
    var nums = [1,2,3,4,5,6,7,8,9,10];
    var selections = [];

    // randomly pick one from the array
    for (var i = 0; i < numPicks; i++) {
        var index = Math.floor(Math.random() * nums.length);
        selections.push(nums[index]);
        nums.splice(index, 1);
    }
    return(selections);
}

你可以在这里看到它:http://jsfiddle.net/jfriend00/b3MF3/

而且,这是一个允许你传递你想要覆盖的范围的版本:

function getRandoms(numPicks, low, high) {
    var len = high - low + 1;
    var nums = new Array(len);
    var selections = [], i;
    // initialize the array
    for (i = 0; i < len; i++) {
        nums[i] = i + low;
    }

    // randomly pick one from the array
    for (var i = 0; i < numPicks; i++) {
        var index = Math.floor(Math.random() * nums.length);
        selections.push(nums[index]);
        nums.splice(index, 1);
    }
    return(selections);
}

那个小提琴:http://jsfiddle.net/jfriend00/UXnGB/

答案 3 :(得分:1)

var a = [];
for (var i = 0; i < 5; i++) {
  var r = Math.floor(Math.random()*10) + 1;
  if(!(r in a))
    a.push(r);
  else
    i--;
}

那会为你做的。不过要小心。如果你生成的随机数大于可能数(10),你将会遇到一个无限循环。

答案 4 :(得分:0)

我正在使用递归函数。测试函数选择1到9之间的6个唯一值。

//test(1, 9, 6);

function test(min, max, nbValue){
    var result = recursValue(min, max, nbValue, []);
    alert(result);
}

function recursValue(min, max, nbValue, result){
    var randomNum = Math.random() * (max-min);
    randomNum = Math.round(randomNum) + min;

    if(!in_array(randomNum, result)){
        result.push(randomNum);
        nbValue--;
    }

    if(nbValue>0){
        recursValue(min, max, nbValue, result);
    }
    return result;
}

function in_array(value, my_array){
    for(var i=0;i< my_array.length; i++){
        if(my_array[i] == value){
            console.log(my_array+" val "+value);
            return true;   
        }        
    }
    return false;
}

答案 5 :(得分:0)

这是一个递归函数,你在寻找什么。

"howMany" parameter is count of how many unique numbers you want to generate.
"randomize" parameter is biggest number that function can generate.

例如:rand(4,8)函数返回一个数字,其中包含4个数字,数字介于0和7之间(因为你知道,Math.random()函数会生成从零到[0]的数字给定数字 - 1])

var array = [];
var isMatch= false;
function rand(howMany, randomize){
     if( array.length < howMany){
    var r = Math.floor( Math.random() * randomize );
    for( var i = 0; i < howMany; i++ ){
        if( array[i] !== r ){
           isMatch= false;
           continue;
            } else {
           isMatch= true;
           break;
        }
    }
    if( isMatch == false ){
       array.push(r);
           ran(howMany, randomize);
    }
        ran(howMany, randomize);
    return array;
     }
}

答案 6 :(得分:0)

答案earlier中确实有一个小错误。代替

var originalLength = grabBag.length;
for(var i = 0; i < originalLength .length; i++){
    console.log(getNextRandom());
}

我相信你的意思是:

var originalLength = grabBag.length;
for(var i = 0; i < originalLength; i++){
    console.log(getNextRandom());
}

谢谢。