课程表

CoffeeScript 语法

CoffeeScript 类和对象

CoffeeScript 字符串

CoffeeScript 数组

CoffeeScript 日期和时间

CoffeeScript 数学

CoffeeScript 方法

CoffeeScript 元编程

CoffeeScript jQuery

CoffeeScript 正则表达式

CoffeeScript 网络

CoffeeScript 设计模式

CoffeeScript 数据库

CoffeeScript 测试

工具箱
速查手册

生成可预测的随机数

当前位置:免费教程 » JS/JS库/框架 » CoffeeScript

问题

你需要生成在一定范围内的随机数,但你也需要对发生器进行“生成种子”操作来提供可预测的值。

解决方案

编写你自己的随机数生成器。当然有很多方法可以做到这一点,这里给出一个简单的示例。 该发生器绝对不可以以加密为目的!

  1. class Rand
  2. # 如果没有种子创建,使用当前时间作为种子
  3. constructor: (@seed) ->
  4. # Knuth and Lewis' improvements to Park and Miller's LCPRNG
  5. @multiplier = 1664525
  6. @modulo = 4294967296 # 2**32-1;
  7. @offset = 1013904223
  8. unless @seed? && 0 <= seed < @modulo
  9. @seed = (new Date().valueOf() * new Date().getMilliseconds()) % @modulo
  10. # 设置新的种子值
  11. seed: (seed) ->
  12. @seed = seed
  13. # 返回一个随机整数满足 0 <= n < @modulo
  14. randn: ->
  15. # new_seed = (a * seed + c) % m
  16. @seed = (@multiplier*@seed + @offset) % @modulo
  17. # 返回一个随机浮点满足 0 <= f < 1.0
  18. randf: ->
  19. this.randn() / @modulo
  20. # 返回一个随机的整数满足 0 <= f < n
  21. rand: (n) ->
  22. Math.floor(this.randf() * n)
  23. #返回一个随机的整数满足min <= f < max
  24. rand2: (min, max) ->
  25. min + this.rand(max-min)

讨论

JavaScript 和 CoffeeScript 都不提供可产生随机数的发生器。编写发生器对于我们来说将是一个挑战,在于权衡量的随机性与发生器的简单性。对随机性的全面讨论已超出了本书的范围。如需进一步阅读,可参考 Donald Kunth 的 The Art of Computer Programming 第 Ⅱ 卷第 3 章的 “ Random Numbers ” ,以及 Numerical Recipes in C 第二版本第 7 章的“ Random Numbers ”。

但是,对于这个随机数发生器只有简单的解释。这是一个线性同余伪随机数发生器,其运行源于一条数学公式 Ij+1 = (aIj+c) % m,其中 a 是乘数,c 是加法偏移量,m 是模数。每次请求随机数时就会执行很大的乘法和加法运算——这里的“很大”与密钥空间有关——得到的结果将以模数的形式被返回密钥空间。

这个发生器的周期为 232。虽然它绝对不能以加密为目的,但是对于最简单的随机性要求来说,它是相当足够的。randn() 在循环之前将遍历整个密钥空间,下一个数由上一个来确定。

如果你想修补这个发生器,强烈建议你去阅读 Knuth 的 The Art of Computer Programming 中的第 3 章。随机数生成是件很容易弄糟的事情,然而 Knuth 会解释如何区分好的和坏的随机数生成。

不要把发生器的输出结果变成模数。如果你需要一个整数的范围,应使用分割的方法。线性同余发生器的低位是不具有随机性的。特别的是,它总是从偶数种子产生奇数,反之亦然。所以如果你需要一个随机的 0 或者 1,不要使用:

  1. # NOT random! Do not do this!
  2. r.randn() % 2

因为你肯定得不到随机数字。反而,你应该使用 r.rand(2)。

转载本站内容时,请务必注明来自W3xue,违者必究。
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号