我需要在JS中随机化一组值,然后我将函数随机调用三次。我怎么能记住并阻止随机发生器给我以前给我的结果?我只能给一次一个值。
var value = Math.floor(Math.random() * 11);
答案 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:
的顺序数组提供了一个很棒的randomsfor(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解决方案。
干杯!