用多线程并发实现不重复的N个伪随机自然数
def NoRep(count) vnow=0 ts=[] count.times do |i| ts[i]=Thread.new do sleep(rand(0.01)) Thread.current["val"]=vnow vnow+=1 end end ary=[] ts.each{|t|t.join;ary<<t["val"]} ary end p NoRep(100)
而另一种不用线程并发的方式为:
def NoRep(n) a=(1..n).to_a ac=[] until a.empty? idx=rand(a.size) x=a[idx] a.delete(x) ac<<x end ac end
文档上说r1.9有Array#choice方法,结果没找到,so...如上。
还有一种方法: (1..100).to_a.sort_by {rand}
最后有一种更简单的方式:Array#shuffle.
最后更新:2017-04-02 05:21:04