• 大多数不加!的函数相当于先 clone 一个原对象再直接对新对象调用加!的函数,但 map 例外。map 相当于建一个新的数组,再把待 map 的元素 push 进新数组,map! 相当于直接遍历并修改数组中的元素。 个人觉得应该几乎所有函数都是加!快一点吧。

  • RESTAPI 分页的疑问 at 2015年04月17日

    #1 楼 @liwei78 谢谢回复,大拿两个字去掉了。。

  • Ruby 中 block 的优先级 at 2015年04月08日

    ruby 程序员都被惯坏了,不爱用括号...不知道 lisp 程序员怎么看。

  • 菜鸟一只,想报名学习一下

  • 和为定值的随机数 at 2015年01月04日

    我也来做做玩玩,先说思路: 使用一个足够大的数字作为引子,生成一个比较大数字组成的数组 big_ary; 这些数字之和不一定等于 80,记为 big_sum; 用 big_sum/sum 得到差距的比值; 如果结果可以是浮点数,用 big_ary 除以比值得到一个 small_ary 已经够了; 但楼主意思应该是要整数数组,因此多一步处理: 先将 small_ary 取整并求和,该和由于舍去小数部分,必然小于 80, 随机挑选 small_ary 中 (80-sum_small) 个数字进行 +1 操作从而补全 80; 这样最终得到的随机数应该是均匀分布的,而且效率在 O(n)

    贴代码,主要重视可读性,未在性能上优化

    BIG_NUM=1000000
    def ran_array_with_sum count, sum
      ary_big = count.times.map{rand BIG_NUM}
      sum_big = ary_big.reduce :+
      proportion = sum_big/sum.to_f
      ary_small = ary_big.map{|i| i/proportion}
      #以下为补全小数
      ary_small_int = ary_small.map{|i| i.to_i}
      sum_small = ary_small_int.reduce :+
      sum_diff = sum - sum_small
      sum_diff.times{ary_small_int[rand count]+=1}
      ary_small_int
    end
    
    ran_array_with_sum 10,80