Ruby中随机数生成器的最快实现?

Lan*_*ard 0 ruby algorithm

什么是编写ruby随机数生成器的最快方法?这有学术公式吗?

我这样做,对于10,000个随机数,它需要大约4秒钟:

def generate_random_num(count = 1)
  count.times.map do |i|
    # make a setting!
    num = rand(99999)
    num = "0" * (5 - num.to_s.length) + num.to_s
    redo if codes.include?(num)
    codes << num
  end
end
Run Code Online (Sandbox Code Playgroud)

我只是想生成多达99999个随机数,全部5位数.有小费吗?

Mad*_*bæk 5

这为您提供了10000个带有前导零的唯一数字(字符串):

(1..10000).to_a.shuffle!.map{|n| n.to_s.rjust(5,'0')}

基准(使用Benchmark.measure):

user       system     total       real
0.020000   0.000000   0.020000 (  0.017471)
Run Code Online (Sandbox Code Playgroud)

但是,我会使用:

(1..10000).to_a.shuffle!
Run Code Online (Sandbox Code Playgroud)

哪个更快:

user       system     total       real
0.000000   0.000000   0.000000 (  0.001692)
Run Code Online (Sandbox Code Playgroud)

输出每个值时添加前导零.根据这篇文章, Ruby shuffle使用了Fisher-Yates算法Saeed提到的.

更新:

因此,要回答您的问题,您可以使用以下代码在[0,99999]范围内生成10000个唯一随机数:

(0..99999).to_a.shuffle!.slice(0..9999).map{|n| n.to_s.rjust(5, '0')}
Run Code Online (Sandbox Code Playgroud)

基准:

user       system     total       real
0.020000   0.000000   0.020000 (  0.026122)
Run Code Online (Sandbox Code Playgroud)