#/*********************************************************** # krnd.rb -- Knuthの乱数発生法 #***********************************************************/ MRND = 1000000000 $jrand = 0 $ia = Array.new(56).fill(0) # ia[1..55] def irn55 for i in 1..24 j = $ia[i] - $ia[i + 31] if (j < 0); j += MRND; end $ia[i] = j end for i in 25..55 j = $ia[i] - $ia[i - 24] if (j < 0); j += MRND; end $ia[i] = j end end def init_rnd(seed) $ia[55] = seed k = 1 for i in 1..54 ii = (21 * i) % 55 $ia[ii] = k k = seed - k if (k < 0); k += MRND; end seed = $ia[ii] end irn55(); irn55(); irn55(); # warm up $jrand = 55 end def irnd # 0 <= irnd() < MRND if (($jrand += 1) > 55); irn55(); $jrand = 1; end return $ia[$jrand] end def rnd # 0 <= rnd() < 1 return (1.0 / MRND) * irnd() end #******************************************************** init_rnd(12345); # 任意の で初期化. 省略不可. for i in 0...160; printf("%10.7f", rnd()); end exit 0