fork(1) download
  1. # Random number generation based on code from GST-3.2.5 (2.01)
  2. # @see qmjAJh
  3.  
  4. class PiRandom
  5. def initialize
  6. self.seed(Time.now.to_f)
  7. end
  8.  
  9. def seed(value)
  10. @state = (value / 100000.0 + value) % 1.0
  11. self.rand
  12. self.rand
  13. end
  14.  
  15. def rand(*args)
  16. case args.size
  17. when 0
  18. @state = ((@state + Math::PI) ** 4) % 1.0
  19. when 1
  20. rand_with(args.first)
  21. else
  22. raise ArgumentError.new("wrong number of arguments "\
  23. "(given #{args.size}, expected 0..1)")
  24. end
  25. end
  26.  
  27. private def rand_with(arg)
  28. case arg
  29. when Float
  30. # [0, arg) exclusive.
  31. self.rand * [arg, 0].max
  32. when Integer
  33. # [0, arg] inclusive.
  34. rand_with(arg + 1.0).to_i
  35. when Range
  36. raise ArgumentError.new("invalid argument: #{arg}")\
  37. if arg.min.nil?
  38. rand_with(arg.max - arg.min) + arg.min
  39. else
  40. raise TypeError.new("no support for #{arg.class}")
  41. end
  42. end
  43. end
  44.  
  45. # Test.
  46.  
  47. def chi_square(n, r, prng)
  48. f = Array.new(r, 0)
  49. n.times do
  50. f[prng.rand(0...r)] += 1
  51. end
  52. t = f.sum {|x| x * x}
  53. r * t / n - n
  54. end
  55.  
  56. prng = PiRandom.new
  57. n = 5
  58.  
  59. n.times do
  60. p chi_square(1000, 100, prng)
  61. end
  62.  
  63. n.times do
  64. # [0.0, 1.0)
  65. p prng.rand
  66. end
  67.  
  68. # Max.
  69.  
  70. n.times do
  71. # [0, 5]
  72. p prng.rand(5)
  73. end
  74.  
  75. n.times do
  76. # [0.0, 5.0)
  77. p prng.rand(5.0)
  78. end
  79.  
  80. # Range.
  81.  
  82. n.times do
  83. # [1, 5]
  84. p prng.rand(1..5)
  85. end
  86.  
  87. n.times do
  88. # [1.0, 5.0)
  89. p prng.rand(1.0..5.0)
  90. end
Success #stdin #stdout 0.02s 7980KB
stdin
Standard input is empty
stdout
121
95
83
104
97
0.35159872963401995
0.8982250650160211
0.3465518098665825
0.039582874147839675
0.41192543767049017
2
0
0
1
0
3.242348905971255
1.7048246464972294
0.4670637588431248
2.6083314807938507
0.41035646198778863
5
3
2
1
4
2.144272674547892
1.1427241596085196
4.641601660778065
3.2879861934388828
1.7385642341052971