1
  start_time = Time.now
  1000000.times do
        rand(36**1024).to_s(36)
  end
  end_time = Time.now
  puts end_time - start_time

235秒。

Rubyでランダムな文字列を生成するより速い方法はありますか?

4

5 に答える 5

3

ターゲット システムに/dev/urandomがある場合、そこからランダムなバイトを読み取ることができます。それはより速いはずです。これがベンチマーク付きのコードです。一部の Ruby ライブラリは、このアプローチを使用してランダムなものを生成します。

Benchmark.bm do|b|

    b.report("Ruby #rand  ") do
      100000.times do
        big_key = rand(36**1024).to_s(36)
      end
    end

    b.report("/dev/urandom") do
      File.open("/dev/urandom",File::RDONLY || File::NONBLOCK || File::NOCTTY) do |f|
        100000.times do
          big_key = f.readpartial(512).unpack("H*")[0]
        end
      end
    end
end

ここでは、100000、1024 文字の長いランダム文字列のベンチマーク結果を確認できます...

       user     system      total        real
Ruby #rand   31.750000   0.080000  31.830000 ( 32.909136)
/dev/urandom  0.810000   5.870000   6.680000 (  6.974276)
于 2012-10-16T11:19:16.020 に答える
2

する必要はありません36**1024 1000000 times

val=36**1024
1000000.times do
  rand(val).to_s(36)
end

これは間違いなくいくらかの時間を節約します

于 2012-10-16T10:28:40.523 に答える
1

セキュアランダムの使用についてはどうですか?

require 'securerandom'

start_time = Time.now
1000000 .times do
  SecureRandom.base64(1024)
end
end_time = Time.now
puts end_time - start_time
于 2012-10-16T10:29:42.290 に答える
1

文字列をシャッフルしてランダムな文字列を取得できます

array = rand(36**1024).to_s(36).split(//)

start_time = Time.now
1000000.times do
  array.shuffle.join
end
end_time = Time.now
puts end_time - start_time

#=> 126 秒

于 2012-10-16T10:28:48.480 に答える
0
1.9.3p194 :113 >   
1.9.3p194 :114 >     start_time = Time.now
 => 2012-10-16 19:51:45 +0530 
1.9.3p194 :115 >   1000000.times do
1.9.3p194 :116 >            (Object.new.hash.to_s << Object.new.hash.to_s)[0..35]
1.9.3p194 :117?>     end
 => 1000000 
1.9.3p194 :118 >   end_time = Time.now
 => 2012-10-16 19:51:46 +0530 
1.9.3p194 :119 >   puts end_time - start_time
1.8252512
 => nil 
1.9.3p194 :120 >   

=> 1.8秒

要するにObject.new.hash.to_s

于 2012-10-16T14:23:14.547 に答える