Seeded random number
我想了一段时间。有没有一个好的(和快速的)方法使一个数字随机,而它的种子?有没有一个好的算法可以把一个数字转换成一个看似随机的数字?
一个小小的例子:
1 2 3 4 5 6 7 8 | specialrand(1) = 8 specialrand(2) = 5 specialrand(3) = 2 specialrand(4) = 5 specialrand(5) = 1 specialrand(1) = 8 specialrand(4) = 5 specialrand(1) = 8 |
如果产出也能是巨大的数字,那就太好了。
注意:我不想填充数组并随机化这些数字,因为我希望能够提供巨大的数字差异,因为每当我重新启动程序时,我都希望得到相同的输出。
你不是在寻找种子随机数。相反,我认为你要找的是一个散列函数。如果你输入相同的数据,得到相同的输出,那就不是随机的。
如果要为运行生成一个随机数序列,但从运行到运行生成的序列相同,则可以使用随机数生成器,在给定相同种子值的情况下生成相同的序列。
这就是最基本的PRNG的工作方式。现在有更多的加密安全的RNG,但是您的标准math.rand()应该可以满足您的需求。
您可以使用日期功能
1 2 3 4 5 6 7 8 9 10 11 | 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));? |
测试在这里
尝试设置一个键或一组键,然后用公式编写函数,返回基于该键的新数字:
一个非常基本的例子是:
1 2 3 4 5 6 7 8 9 10 11 | 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; } |
号
但是,您可以创建一个高度复杂的方程来生成"随机"数字,并确保每次返回相同的数字。
也许你要找的是伪随机数生成器。
例如xorshift。
1 2 3 4 5 6 7 8 9 10 11 | 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)); } |
您可以创建如下内容:
- 带上一粒种子
- SpecialRand(5)是一个函数,它从这个种子中提取第五个随机数。
- 或者特殊随机数(5)是一个函数,它从种子+5中得到第一个随机数。
也许这就够了。