(P)RNG - 用种子创建的随机数阵列

时间:2011-03-21 13:54:56

标签: javascript arrays random

我想使用种子创建一个随机/伪随机数组。我希望在使用相同的种子时创建相同的数组,并且我希望在数组中有很少或没有可见的模式。我在使用JavaScript。

这是我正在使用的随机功能,我很满意(抱歉,我忘了原作者是谁):

function random(seed) {
    if (!seed) seed = new Date().getTime();
    seed = (seed*9301+49297) % 233280;
    return seed/(233280.0);
}

这是数组生成:

var superSeed = random();
var nRandom = 100;
var randomArray = new Array();
for (var i = 0 ; i < nRandom ; i++){
    randomArray.push(random((superSeed*10)+ (i)));
}
不管怎么说,无论我多久运行一次,模式似乎都非常相似。 This question似乎是相似的,但由于它是关于矩阵的,我不明白所说的是什么。

谢谢!

3 个答案:

答案 0 :(得分:2)

在我认为我们可以使用一个相当简单的系列之前处理过类似的事情,这个系列需要两个初始值,然后你可以获得更多。

var a1,b1;

function InitSequence(v1, v2) {
    a1 = Math.pow(v1, 5) / Math.pow(v1, 3);
    b1 = Math.pow(v2, 8);
    lastrand = (a1 + b1) & 0x7fffffff;
}

function SequenceNext() {
    var alast = a1;
    var nextVal = (a1 + b1) & 0x7fffffff;
    b1 = alast;
    a1 = nextVal;
    return nextVal;
}

然后像这样使用它:

InitSequence(75, 21);
for (var i = 0; i < 99; i++) {
    v = SequenceNext();
}

我测试了这样:

var used = new Array();

InitSequence(75, 21); // any two values will do.

// fill 10k into array.

for (var i = 0; i < 9999; i++) {
    v = SequenceNext();
    if (undefined != used[v]) {
        used[v]++;
    } else used[v] = 1;

    //document.write(i+": "+v+"<br>");
}

// see if there any duplicates.
var tdup = 0;
for (xx in used) {
    ndup = used[xx];
    if (ndup > 1) {
        document.write("duplicated " + xx + " :" + ndup + "<br>");
        tdup += ndup;
    }
}
document.write("Total dups " + tdup + "<br>");

这是使用Fibonacci系列,在数学术语中,Fibonacci数字的序列Fn由递归关系定义 Fibonacci  recurrence relation。我从不同的值开始 - (v1 ^ 5)/(v1 ^ 3)和v2 ^ 8;否则它只会是相同的。

答案 1 :(得分:2)

我喜欢“Super 7”PRNG。它简单,快速(虽然其他答案与fib。序列也很快),并且具有有趣的特性:

  • 在整个范围内 - 尽管只有32k - ,使用“Super 7”PRNG没有重复

可以连接多个7来增加位数和/或提供多个种子。这种不重复的属性可以暴露或折叠。

(给定起始种子,PRNG的序列始终是相同的:它是有趣的分布和周期长度 - 正是这些属性可能使它们在不需要“真正随机性”的不同情况下是理想的)。

快乐的编码。

答案 2 :(得分:0)

也许你应该试试这个

function s_random() {
  s_random.m = 71402523; s_random.a = 409647; s_random.c = 1508892;
  s_random.seed = (s_random.seed*s_random.a + s_random.c) % s_random.m;
  return s_random.seed / s_random.m;
}
/* 
generate IV
s_random.seed = Math.floor((new Date).getTime()/10000);
*/
s_random.seed = 130324232; 

var CheckRandom = 4999999; var PrintSamples = 100; var used = new Array();

for (var i = 0; i < CheckRandom; i++) { v = (Math.ceil(Math.sqrt(s_random())* 1000000000) * 8); if (undefined != used[v]) { used[v]++; } else used[v] = 1; if ( i< PrintSamples) document.write(i+": "+v+"
"); } /* see if there are any duplicates. */ var tdup = 0; for (xx in used) { ndup = used[xx]; if (ndup > 1) { if (ndup < PrintSamples) document.write("duplicated " + xx + " :" + ndup + "
"); tdup += ndup; } } document.write("Total generated " + CheckRandom + "
"); document.write("Total duplicates " + tdup + "
");

只有500万个种子,可重复的随机数字,没有重复。使用Safari在Mac OS X上多次测试。

干杯, 卡尔