在Ruby中有没有一种惯用的方法来获取随机Fixnum?
我在玩一个使用随机数的算法。如果能够最大化随机性,同时将数字保持为一个性能合理的整数,那就太好了,因此理想情况下,它们应该在在Ruby中有没有一种惯用的方法来获取随机Fixnum?,ruby,random,idioms,Ruby,Random,Idioms,我在玩一个使用随机数的算法。如果能够最大化随机性,同时将数字保持为一个性能合理的整数,那就太好了,因此理想情况下,它们应该在Fixnum::MIN.的范围内。。Fixnum::MAX,但是0..Fixnum::MAX也应该可以 哦,等等。那些常数实际上并不是存在的东西。所以当你读到这篇文章时,唯一明显的做法就是 在Ruby中有没有更惯用的方法来获取一个随机整数,或者Yukihiro只是希望我的代码变得可怕,如果我想要这种功能,就复制可疑的整数大小求幂?这应该会为您提供相当多的样本整数: requ
Fixnum::MIN.的范围内。。Fixnum::MAX
,但是0..Fixnum::MAX
也应该可以
哦,等等。那些常数实际上并不是存在的东西。所以当你读到这篇文章时,唯一明显的做法就是
在Ruby中有没有更惯用的方法来获取一个随机整数,或者Yukihiro只是希望我的代码变得可怕,如果我想要这种功能,就复制可疑的整数大小求幂?这应该会为您提供相当多的样本整数:
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)
0..FIXNUM\u MAX中的随机值
当Fixnum溢出时,Ruby将只转换为Bignum。但是,演示了如何为您的平台计算Fixnum的最小值和最大值。以此为起点,您可以通过以下方式获得所需范围内的正整数:
FIXNUM_MAX = (2**(0.size * 8 -2) -1)
Random.rand FIXNUM_MAX
负整数
如果您也坚持使用负数,那么以下内容对于您来说可能“足够接近”,即使在您的平台上FIXNUM\u MIN.abs==FIXNUM\u MAX
可能是错误的:
FIXNUM_MAX = (2**(0.size * 8 -2) -1)
random_num = Random.rand FIXNUM_MAX
random_num.even? ? random_num : random_num * -1
另见
Bignum
对象p(1..5).map{rand(0..2**64-1).class}
=>[Fixnum,Bignum,Bignum,Bignum]
对不起,没有读到您只在寻找fixnums,编辑了这个问题,所以现在最后一个示例将为您提供从最小到最大Fixnum的所有数字。