(seed * 9301 + 49297)%233280随机算法的原始来源?


9

如果您搜索创建种子式(伪)随机数生成器的示例,则会遇到类似以下内容(特定示例http://indiegamr.com/generate-repeatable-random-numbers-in-js/):

// the initial seed
Math.seed = 6;

// in order to work 'Math.seed' must NOT be undefined,
// so in any case, you HAVE to provide a Math.seed
Math.seededRandom = function(max, min) {
    max = max || 1;
    min = min || 0;

    Math.seed = (Math.seed * 9301 + 49297) % 233280;
    var rnd = Math.seed / 233280;

    return min + rnd * (max - min);
}

这些特定的编号(9301、49297、233280)和算法一再使用,但似乎没有人对此有确切的参考。谁发明了这种算法并测试了分布?是否有论文或要引用的东西?


5
它是线性一致发生器,但周期很小(仅233k,而32位int允许有40亿周期)
棘轮怪胎

1
人们通常直接从书本中复制代码,因此它可能是从某处的旧书中复制的。这似乎也是一个限制条件。也许有所帮助:heydari.persiangig.com/Ebooks/Applied_Crypto-Ch11-ch20.pdf/... ict.griffith.edu.au/anthony/info/C/RandomNumbers
barrycarter

2
无论起源如何,这些都是用于计算种子的可怕值。

3
@jlarson评论还不够长,但是有两个问题。首先,正如棘轮怪胎所暗示的那样,模是最大周期:生成器重复其自身之前的唯一数的数量。实际时间可能会更短。其次,其他两个数字(多数为被乘数)应对于模数为数,以确保更长的周期。理想情况下,模数是小于适合数据类型的最大正整数的最大质数,其他两个数也是大质数。

1
这就是为什么这些数字很糟糕的简短描述,因为这是附带讨论,添加实际答案不适用于此问题。我建议在Wikipedia以及数学计算机科学附近弹跳以获得更多信息,尽管伪随机数算法在技术上也很受程序员欢迎。

Answers:


7

快速搜索Google图书显示这些数字(9301、49297、233280)已在许多参考文献中使用:

  • FORTRAN 77中的数字配方
  • C ++数值方法简介
  • CGI开发人员资源:TCL和PERL中的Web编程
  • 对工程师和科学家有效的Fortran 77
  • JavaScript开发
  • 全部在C上
  • 简而言之Java示例
  • 半数值算法
  • 力学概论

最古老的是1977年的数学计算方法,计算机由乔治·埃尔默福赛斯,迈克尔A.马尔科姆,克利夫B. Moler(普伦蒂斯霍尔),虽然谷歌并没有显示其中文本是在本书中,因此无法通过验证。

最早显示的文本是《帕斯卡数字食谱》(第一版):《科学计算的艺术》 Press,Teukolsky,Vetterling和Flannery撰写的第一卷,位于整页的“便携式随机数生成器常量”表中。这些特定的数字在2 ^ 31处溢出。

数字食谱》系列书非常受欢迎,自1986年以来一直在印刷。


1
哇,如果答案不在这里,我不知道它在哪里。谢谢.. //我很希望能够针对这些数字为何如此特殊而进行一些特定的研究,但这足够了。9301是两个素数(71x131)的乘积,49297是素数-我本能地感觉到这必须是相关的。233280不是素数-等于2x2x2x2x2x2x3x3x3x3x3x3x5(或2 ^ 6 * 3 ^ 5 * 5)
jlarson 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.