我想使用种子创建一个随机/伪随机数组。我希望在使用相同的种子时创建相同的数组,并且我希望在数组中有很少或没有可见的模式。我在使用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似乎是相似的,但由于它是关于矩阵的,我不明白所说的是什么。
谢谢!
答案 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由递归关系定义 。我从不同的值开始 - (v1 ^ 5)/(v1 ^ 3)和v2 ^ 8;否则它只会是相同的。
答案 1 :(得分:2)
我喜欢“Super 7”PRNG。它简单,快速(虽然其他答案与fib。序列也很快),并且具有有趣的特性:
可以连接多个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上多次测试。
干杯, 卡尔