Advertisement
Jessehz

uheprng.rb

Sep 11th, 2013
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 1.16 KB | None | 0 0
  1. def generate(megs)
  2.     prng = uheprng
  3.     mb = 1024**2
  4.     count = megs * mb
  5.     block = Array.new
  6.     stream = File.new("uheprng.bin", "w")
  7.     Kernel.printf("Running uheprng.rb to generate %d megabytes of pseudo-random data...\n", megs)
  8.     count.times do |i|
  9.         block.push(prng.call(0x100))
  10.         (i+1)%16384 == 0 or next
  11.         stream.write(block.pack("C*"))
  12.         block.clear
  13.         Kernel.printf("%s%.2f mb, (%.1f%%)", 8.chr*22, ((i+1).fdiv(mb)), ((i+1).fdiv(count)*100))
  14.     end
  15.     stream.close
  16.     Kernel.printf("\n\n--- Done!! ---\n")
  17. end
  18. def uheprng
  19.     size = 48
  20.     c = 1
  21.     pos = size
  22.     state = mash(size, 0xefc8249d)
  23.  
  24.     rawprng = proc do
  25.         (pos+=1) >= size and pos = 0
  26.         t = 1768863 * state[pos] + c * 2.3283064365386963e-10 # 2^-32
  27.         state[pos] = t - (c = t.to_i)
  28.     end
  29.  
  30.     proc do |range|
  31.         (range * (rawprng.call + (rawprng.call * 0x200000).to_i * 1.1102230246251565e-16)).floor # 2^-53
  32.     end
  33. end
  34. def mash(count, n)
  35.     count.times.map do
  36.         Kernel.rand.to_s.bytes do |b|
  37.             n += b
  38.             h = 0.02519603282416938 * n
  39.             n = h.to_i
  40.             h -= n
  41.             h *= n
  42.             n = h.to_i
  43.             h -= n
  44.             n += h * 0x100000000 # 2^32
  45.         end
  46.         n.to_i * 2.3283064365386963e-10 # 2^-32
  47.     end
  48. end
  49.  
  50. generate(ARGV.shift.to_i)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement