大多数不加!的函数相当于先 clone 一个原对象再直接对新对象调用加!的函数,但 map 例外。map 相当于建一个新的数组,再把待 map 的元素 push 进新数组,map! 相当于直接遍历并修改数组中的元素。 个人觉得应该几乎所有函数都是加!快一点吧。
ruby 程序员都被惯坏了,不爱用括号...不知道 lisp 程序员怎么看。
菜鸟一只,想报名学习一下
我也来做做玩玩,先说思路: 使用一个足够大的数字作为引子,生成一个比较大数字组成的数组 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