算法 求精减:目的是得到 1000 个 1 到 10 的随机数,1 的总数比 2 的多,2 比 3 多以此类推

fayake · 2015年04月02日 · 最后由 reboot 回复于 2016年03月04日 · 7646 次阅读
r = Hash.new(0)
1000.times do
  ran = rand(10)+1
  r[ran] = r[ran]+1
end
new = r.values.sort
loop do
new.size.times do |i|
  if new[i+1].present? && new[i] >= new[i+1]
    new[i] = new[i]-1
    new[i+1] = new[i+1]+1
  end
end
  break if new.size == new.uniq.size
end
r.size.times { |i|  r[i+1] =new.reverse[i]}
Hash[r.sort]
counts = 1000.times.map{ rand 10 }.group_by{|d| d }.map{|k, v| v.size }.sort_by &:-@
res = counts.each_with_index.flat_map {|c, i| Array.new c, i+1 }

#1 楼 @luikore 感谢回复,有二个问题还需要请教下 1、下面个这是什么意思

.sort_by &:-@

2、您的执行结果出来会有重复的问题,假如 10 个 3 和 10 个 4 或 10 个 10 对于去重您有什么办法吗,我写的是 loop,求教了

#2 楼 @fayake

  1. 逆序排列,-@ 是前缀 - 的方法名

  2. 重复问题我没考虑到... 貌似还是得用土法去重 -_-

#3 楼 @luikore 学习了 以前都是先 sort 再 reverse 现在会了&:-@ 不过我找了 ruby 资料实在是没有找到(&:-@)的出处 您还记得在哪看到的吗要是记得回我个连接, 或是有学习的网站发我下也可以 实在感谢

遗传算法。

可否设置 1~10 每个数字随机生成的概率不同?

def my_rand (num)
    a = (1..10).flat_map { |i| [i] * i }
    return (1..num).map { a[rand a.size] }
end

test = my_rand 1000

也可以

需要 登录 后方可回复, 如果你还没有账号请 注册新账号