在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
另见

您是指大小无限的随机整数?这几乎不是你真正需要的。你的实际上限是多少?@RobertHarvey-这正是教科书中的实现在这个算法中所要求的:一堆元素得到随机权重,这些权重由于各种原因相互比较(没有对这些对象执行其他数学)。它们可能是我所关心的字符串,但如果它们很快就好了。冲突不会影响算法的正确性,偶尔的冲突只会对性能产生微不足道的影响,但同时,实际上没有必要使随机可比数据池小于必要值,并且可能会涉及所有元素的随机数。那么,您的实际上限是多少?它不可能是无限的。我怀疑这里的实际答案是“使用可怕的黑客,继续生活。”@daremkd AFAIK,Kernel#rand并不总是将Range对象作为参数,但它现在似乎在Ruby 2.1.2上起作用。我的回答略有不同,但在数百万次试验中,您的范围似乎运行良好。有关测试代码,请参阅。因此,上一个示例是错误的,经常返回
Bignum
对象
p(1..5).map{rand(0..2**64-1).class}
=>
[Fixnum,Bignum,Bignum,Bignum]
对不起,没有读到您只在寻找fixnums,编辑了这个问题,所以现在最后一个示例将为您提供从最小到最大Fixnum的所有数字。