在Javascript中随机化值

时间:2009-08-18 12:49:08

标签: javascript random

我需要在JS中随机化一组值,然后我将函数随机调用三次。我怎么能记住并阻止随机发生器给我以前给我的结果?我只能给一次一个值。

var value = Math.floor(Math.random() * 11);

8 个答案:

答案 0 :(得分:3)

使用记忆模式。

var randomize = (function () {
    var memo = [],
        maxlen = 10;
    return function() {
        if (memo.length === maxlen) {
            throw new Error('Out of values');
        }
        var value = Math.floor(Math.random() * (maxlen + 1));
        if (memo.indexOf(value) !== -1) {
            return randomize();
        }
       memo.push(value);
       return value;
    };
}());

答案 1 :(得分:1)

像这样(测试过):

Array.prototype.unique = function () {
    var r = new Array();
    o:for(var i = 0, n = this.length; i < n; i++)
    {
        for(var x = 0, y = r.length; x < y; x++)
        {
            if(r[x]==this[i])
            {
                continue o;
            }
        }
        r[r.length] = this[i];
    }
    return r;
}

var temp = [];

//keep going until the array size is three
while(temp.length < 3) {
    temp.push(Math.floor(Math.random() * 11));
    //unique() will remove the dupes thus affecting the length 
    temp = temp.unique();
}

alert(temp[0] + ' ' + temp[1] + ' ' + temp[2]);

答案 2 :(得分:1)

你的更大目标是什么?如果您尝试以随机顺序从有限集中选择项目,那么您将需要使用随机算法来对顺序进行随机化,然后根据需要在生成的混洗顺序中删除它们。

答案 3 :(得分:0)

您可以使用时间刻度而不是使用Random(),每次使用时都会给您一个随机值 -

var random = (new Date()).getTime();


或者,您可以扩展默认的JS Array,并向其添加contains方法。您生成的每个随机值都将添加到数组中,但在添加之前,contains方法将检查它是否已存在于数组中。

答案 4 :(得分:0)

使用哈希。

var values = {};
count = 0; //keep count of how many are there if you want.
while( count < something ) {
    var rand = Math.random();
    if( !values[rand] ) {
        values[rand] = true;
        count++;
    }
}

然后你可以根据需要将所有这些转储到一个数组中 - 那就是O(n)。

var arrValues = [];
for( var p in values ) arrValues.push( new Number(p) );

答案 5 :(得分:0)

通过分配int:

的顺序数组提供了一个很棒的randoms
for(i = 0; i < 100; ++i) myArr[i]=i;

然后你按照Math.floor(Math.random()* myArr.length)顺序移动数字;

这种方法的好处 - 你得到任何长度的不可重复的序列。

答案 6 :(得分:0)

使用随机种子实现伪随机算法。有几种这样的算法,有些比其他算法更好。维基百科有一个list of algorithms

您可以使用Linear Congruential Generator(LCG),这是众所周知的Pseudo Random Number Generator(PRNG)之一。以下代码使用内置的inn随机数生成器(可能使用LCG),然后将LCG算法用于其他数字。这确保没有两个连续的数字是相同的。还有一个范围和偏移量,因此您可以限制所获得的数字范围(在这种情况下,它将是1到10之间的数字)。

var range = 9;
var offset = 1;

function rand(x){
  var a = 1664525;
  var m = 4294967296;
  var c = 1013904223;
  return (a*x + c) % m;
}

var num1 = rand(Math.round(Math.random()*100000)) % range + offset;
var num2 = rand(num1) % range + offset;
var num3 = rand(num2) % range + offset;

答案 7 :(得分:0)

从你的评论来看,听起来你有一小部分价值(即从1-10开始),你想从中随机选择你的价值。 在这种情况下,最好的办法是将值存储在一个数组中并随机拼接出来。 我更喜欢使用某种生成器来执行这些操作。

function createRandomGenerator( array ) {
    return function() {
        return array.splice(Math.floor(Math.random()  * array.length ),1)[0];
    }
}

要使用生成器创建器,请为其提供唯一值的简短列表,并存储结果。结果是一个生成器,您可以使用它从唯一值列表中生成N个随机数。 (其中N是您为随机生成器播种的数组的长度)。

var random1to10 = createRandomGenerator( [1,2,3,4,5,6,7,8,9,10] );

然后,您可以通过调用该函数反复返回的生成器来使用生成器。

var a = [];
for( var i = 0; i < 10; i++ ) {
    a.push( random1to10() );
}
alert(a.join(','));

如果您没有想要使用的预定义数字,我建议使用上面的TörökGábor解决方案。

干杯!