CoffeeScript 生成可预测的随机数


本文整理自网络,侵删。

生成可预测的随机数

问题

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

解决方案

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

class Rand
  # 如果没有种子创建,使用当前时间作为种子
  constructor: (@seed) ->
    # Knuth and Lewis' improvements to Park and Miller's LCPRNG
    @multiplier = 1664525
    @modulo = 4294967296 # 2**32-1;
    @offset = 1013904223
    unless @seed? && 0 <= seed < @modulo
      @seed = (new Date().valueOf() * new Date().getMilliseconds()) % @modulo

  # 设置新的种子值
  seed: (seed) ->
    @seed = seed

  # 返回一个随机整数满足 0 <= n < @modulo
  randn: ->
    # new_seed = (a * seed + c) % m
    @seed = (@multiplier*@seed + @offset) % @modulo

 # 返回一个随机浮点满足 0 <= f < 1.0
  randf: ->
    this.randn() / @modulo

  # 返回一个随机的整数满足 0 <= f < n
  rand: (n) ->
    Math.floor(this.randf() * n)

  #返回一个随机的整数满足min <= f < max
  rand2: (min, max) ->
    min + this.rand(max-min)

讨论

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

阅读剩余部分

相关阅读 >>

CoffeeScript 当函数括号不可选

CoffeeScript 关于

CoffeeScript 找到上一个月(或下一个月)

CoffeeScript 将数组连接

CoffeeScript sqlite

CoffeeScript 筛选数组

CoffeeScript 双向服务器

CoffeeScript 比较范围

CoffeeScript 清理字符串前后的空白符

CoffeeScript 对象的链式调用

更多相关阅读请进入《CoffeeScript》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...