我一直想知道。是否有一种好的(快速)方法可以在播种时使数字随机变化? 是否有一个很好的算法将一个数字转换成一个看似随机的数字。
一个小插图:
specialrand(1) = 8
specialrand(2) = 5
specialrand(3) = 2
specialrand(4) = 5
specialrand(5) = 1
specialrand(1) = 8
specialrand(4) = 5
specialrand(1) = 8
如果输出也可能是巨大的数字,那将是非常好的。
作为一个注释:我不想填充数组并随机化数字,因为我希望能够提供巨大的数字差异,因为每当我重新启动程序时我都想要相同的输出
答案 0 :(得分:6)
您不是在寻找种子随机数。相反,我认为你正在寻找的是散列函数。如果您输入相同的输入并获得相同的输出,那么这不是随机的。
如果您要为运行生成一系列随机数,但是从运行到运行生成相同的序列,则可以使用生成相同序列的随机数生成器相同的种子价值。
这是pRNG最基本的工作方式。有更多加密安全的RNG,但您的标准Math.rand()应该可以满足您的需求。
答案 1 :(得分:0)
也许pseudorandom number generators正是您所寻找的。
例如XORshift。
uint32_t xor128(void) {
static uint32_t x = 123456789;
static uint32_t y = 362436069;
static uint32_t z = 521288629;
static uint32_t w = 88675123;
uint32_t t;
t = x ^ (x << 11);
x = y; y = z; z = w;
return w = w ^ (w >> 19) ^ (t ^ (t >> 8));
}
你可以创建这样的东西:
这可能足以满足您的目的。
答案 2 :(得分:0)
尝试设置一个键或一组键,然后使用等式编写一个函数,以根据该键返回一个新数字:
一个非常基本的例子是:
function specialrand(value) {
key = array (1,2,4,6,8);
for (k in key) {
if (k%2 === 0) {
value -= key[k] * value;
} else {
value += key[k] / value;
}
}
return value;
}
然而,您可以创建一个高度复杂的等式来生成“随机”数字,并确保每次都返回相同的数字。
答案 3 :(得分:0)
您可以使用日期功能
Math.valueOfSeed = function(n)
{
return Number(new Date(n%9999, n%12, n%30, n%24, n%60, n%60, n%1000));
};
alert(Math.valueOfSeed(1) + " = " + Math.valueOfSeed(1));
alert(Math.valueOfSeed(2) + " = " + Math.valueOfSeed(2));
alert(Math.valueOfSeed(15) + " = " + Math.valueOfSeed(15));
alert(Math.valueOfSeed(5555) + " = " + Math.valueOfSeed(5555));
alert(Math.valueOfSeed(21212121) + " = " + Math.valueOfSeed(21212121));
alert(Math.valueOfSeed(6554654654) + " = " + Math.valueOfSeed(6554654654));
测试是here