【问题标题】:Seeded random number种子随机数
【发布时间】:2012-03-15 20:00:50
【问题描述】:

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

一个小插图:

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

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

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

【问题讨论】:

  • 如果你每次重启程序都想要同样的输出,那不是随机的……
  • 你的问题看了几遍,看不懂。
  • 它一定是看似随机而不是真正随机。
  • 您不是在寻找种子随机数。相反,我认为您正在寻找的是散列函数。如果你输入相同的输入并得到相同的输出,那不是随机的。

标签: javascript math random random-seed


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    也许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));
    }
    

    你可以创建这样的东西:

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

    也许这对你的目的来说已经足够了。

    【讨论】:

      【解决方案3】:

      尝试设置一个键或一组键,然后编写一个带有方程式的函数,以根据该键返回一个新数字:

      一个非常基本的例子是:

      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;
      }
      

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

      【讨论】:

        【解决方案4】:

        您可以使用日期功能

        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

        【讨论】:

          猜你喜欢
          • 2011-04-04
          • 2013-05-28
          • 2013-03-27
          • 1970-01-01
          • 1970-01-01
          • 2021-05-15
          • 2021-07-28
          • 2016-08-12
          相关资源
          最近更新 更多