Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript中的随机化值_Javascript_Random - Fatal编程技术网

Javascript中的随机化值

Javascript中的随机化值,javascript,random,Javascript,Random,我需要在JS中随机化一组值,例如,我调用函数randomize三次。我怎样才能记住并阻止随机生成器给我以前给我的结果呢?我只能给出一个值一次 var value = Math.floor(Math.random() * 11); 您可以使用时间刻度,而不是使用Random(),它将在每次使用时为您提供一个随机值- var random = (new Date()).getTime(); 或者,您可以扩展默认的JS数组,并向其中添加contains方法。您生成的每个随机值都将添加到数组中,但

我需要在JS中随机化一组值,例如,我调用函数randomize三次。我怎样才能记住并阻止随机生成器给我以前给我的结果呢?我只能给出一个值一次

var value = Math.floor(Math.random() * 11);
您可以使用时间刻度,而不是使用Random(),它将在每次使用时为您提供一个随机值-

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

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

类似的内容(已测试):

Array.prototype.unique=函数(){
var r=新数组();
o:for(var i=0,n=this.length;i
使用散列

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++;
    }
}

通过分配int的顺序数组提供了一个奇妙的随机数:

for(i = 0; i < 100; ++i) myArr[i]=i;
(i=0;i<100;++i)myArr[i]=i;
然后,按Math.floor(Math.random()*myArr.length)的顺序将数字移位


这种方法的好处是:可以获得任何长度的不可重复序列。

使用记忆模式

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;
    };
}());

只需使用随机种子实现一个伪随机算法。有几种这样的算法,有些比另一些好。维基百科有一个独特的功能

您可以使用(LCG),最著名的(PRNG)之一。下面的代码使用内置的inn随机数生成器(可能使用LCG),然后对其他数字使用LCG算法。这样可以确保没有两个连续的数字是相同的。还有一个范围和偏移量,因此您可以限制获得的数字的范围(在本例中是从1到10的数字)


从您的评论来看,听起来您有一个小范围的值(即1-10),您希望从中随机选择您的值。 在这种情况下,最好的办法是将值存储在数组中,然后随机拼接。 我更喜欢使用某种生成器执行这些类型的操作

function createRandomGenerator( array ) {
    return function() {
        return array.splice(Math.floor(Math.random()  * array.length ),1)[0];
    }
}
要使用生成器创建者,请向其提供唯一值的简短列表,并存储结果。结果是一个生成器,您可以使用它从唯一值列表生成N个随机数。(其中N是随机生成器的种子数组长度)

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

var a = [];
for( var i = 0; i < 10; i++ ) {
    a.push( random1to10() );
}
alert(a.join(','));
var a=[];
对于(变量i=0;i<10;i++){
a、 推(随机1到10());
}
警惕(a.加入(“,”);
如果您没有想要使用的预定义数字集,我推荐上面的Török Gábor解决方案


干杯

你更大的目标是什么?如果您试图以随机顺序从有限的集合中选择项目,那么您需要考虑使用随机排列算法对顺序进行随机排列,然后根据需要以产生的随机排列顺序删除它们。

for循环之前的
o:
代表什么?fphilipe,它是continue使用的标签。如果不存在continue,则continue将继续内部循环。@fphilipe:
o
是@karim79用于
continue
语句的标签。您需要在第一节的周围有一个循环。我不清楚你所说的“如果你想要O(n)的话,把所有这些都转储到一个数组中”是什么意思…您已经完成了工作…您不能通过将O值放入新的数据结构来降低O值。我遗漏了什么吗?嘿,您能告诉我我还没有完全醒来吗?虽然这是PRNG的一个很好的解决方案,但海报不希望结果中出现重复的数字。虽然LCG防止序列号重复,但具体的seeds可能会导致生成小的数字池,从而导致重复的数字。例如,尝试使用值27369对rand进行种子设定,该值应在数字7和4之间交替。很好的解决方案!请注意此特定示例中的无限递归。
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;
function createRandomGenerator( array ) {
    return function() {
        return array.splice(Math.floor(Math.random()  * array.length ),1)[0];
    }
}
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(','));