是否有IDIOMATIC方法在Ruby中获取随机Fixnum?

时间:2014-09-22 18:57:10

标签: ruby random idiomatic

我正在玩一种使用随机数的算法。能够最大化我可以获得的随机性同时保持数字是一个很好的合理性能整数会很好,所以理想情况下它们在Fixnum::MIN .. Fixnum::MAX范围内,但0..Fixnum::MAX应该没问题太

OH WAIT 。那些常量实际上不是存在的东西。因此,当您阅读Random.rand returns a float unless you pass it an integer argument时,唯一明显的行动方针是resort to terrible hacks like these

有没有更惯用的方式在Ruby中获取随机整数,或者Yukihiro是否只是希望我让我的代码变得可怕并且如果我想要这种能力则重复可疑的整数大小的指数?

3 个答案:

答案 0 :(得分:1)

这样可以获得相当多的样本整数:

require "securerandom"
exponent = rand(1..15)
puts (SecureRandom.random_number * 10**exponent).to_i

更快的工作算法,可产生相同或更好的随机性:

r = Random.new
exponent = rand(1..15)
puts (r.rand * 10**exponent).to_i

甚至更简单的方法:

FIXNUM_MAX = (2**(0.size * 8 -2) -1)
FIXNUM_MIN = -(2**(0.size * 8 -2))
p rand(FIXNUM_MIN..FIXNUM_MAX)

答案 1 :(得分:1)

0..FIXNUM_MAX

中的随机值

当Fixnum溢出时,Ruby将只转换为Bignum。但是,this related answer显示了如何计算平台的Fixnum的最小值和最大值。使用它作为起点,您可以使用以下方法获得所需范围内的正整数:

FIXNUM_MAX = (2**(0.size * 8 -2) -1)
Random.rand FIXNUM_MAX

负整数

如果你坚持也有负数,那么以下可能是"足够接近"为了您的目的,即使您的平台上FIXNUM_MIN.abs == FIXNUM_MAX可能是错误的:

FIXNUM_MAX = (2**(0.size * 8 -2) -1)
random_num = Random.rand FIXNUM_MAX
random_num.even? ? random_num : random_num * -1

另见

答案 2 :(得分:-1)

不,没有。选择你丑陋的黑客。