3

我想知道有一段时间了。有没有一种好的(和快速的)方法可以在播种时使数字随机化?有没有一种很好的算法可以将一个数字转换为看似随机的数字。

一个小插图:

specialrand(1) = 8
specialrand(2) = 5
specialrand(3) = 2
specialrand(4) = 5
specialrand(5) = 1
specialrand(1) = 8
specialrand(4) = 5
specialrand(1) = 8

如果输出也可以是巨大的数字,那就太好了。

注意:我不想填充数组并将数字随机化,因为我希望能够提供巨大的数字差异,因为每当我重新启动程序时我都想要相同的输出

4

4 回答 4

6

您不是在寻找种子随机数。相反,我认为您正在寻找的是散列函数。如果您输入相同的输入并获得相同的输出,那不是随机的。

如果您希望为运行生成一系列随机数,但每次运行都生成相同的序列,则可以使用随机数生成器在给定相同种子值的情况下生成相同的序列。

这就是最基本的 pRNG 的工作方式。那里有更多加密安全的 RNG,但您的标准 Math.rand() 应该可以满足您的需求。

于 2012-03-15T20:13:01.853 回答
0

也许您正在寻找伪随机数生成器。

例如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));
}

你可以创建这样的东西:

  • 取一颗种子
  • specialrand(5) 是一个函数,它从这个种子中获取第五个随机数
  • 或 specialrand(5) 是从种子+5 中获取第一个随机数的函数

也许这足以满足您的目的。

于 2012-03-15T20:06:52.383 回答
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;
}

但是,您可以创建一个高度复杂的方程式来生成“随机”数字,并确保每次返回相同的数字。

于 2012-03-15T20:20:01.680 回答
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));​ 

测试在这里

于 2012-03-15T20:29:41.880 回答